min() arg — это пустая последовательность, что делать, если ни одно число не попадает в мой def

#python #sequence

#python #последовательность

Вопрос:

Привет, у меня проблема с моим кодом, и я не знаю, как ее решить. Задача такова: «Сколько последовательных чисел необходимо?» … чтобы заполнить массив. Пример: [1, 2, 4, 6] ответ должен быть 2. Это то, что я получил.

 def consecutive(arr):
    arr.sort()
    minimum = min(arr)
    maximum = max(arr)

    diff = maximum - minimum - len(arr)   1

    return diff
 

проблема в том, что когда arr равен [], он не работает. Что я могу изменить в своем коде.

Комментарии:

1. добавьте условие, если arr оно пустое

2. Я не понимаю логики — можете ли вы немного объяснить? сортировка массива здесь бессмысленна, либо возьмите первый и последний элемент отсортированного списка, либо примените max / min

3. max() / min() имеет default аргумент для обработки пустых итераций

Ответ №1:

Вы можете вычислить только минимум и максимум непустого списка, поэтому у вас есть две альтернативы: вызвать исключение, если входные данные пусты, или предоставить значение по умолчанию для возврата в случае пустого списка. (В обоих случаях вызывающий объект должен решить, что нужно, если список пуст, вместо того, чтобы заставлять функцию угадывать соответствующее значение.)

  1. Вызовите исключение.
     def consecutive(arr):
        if not arr:
            raise ValueError("List is empty")
    
        minimum = min(arr)
        maximum = max(arr)
    
        diff = maximum - minimum - len(arr)   1
    
        return diff
     
  2. Укажите значение по умолчанию
     def consecutive(arr, if_empty=None):
        if not arr:
            return if_empty
    
        minimum = min(arr)
        maximum = max(arr)
    
        diff = maximum - minimum - len(arr)   1
    
        return diff
     

Обратите внимание, что ни в том, ни в другом случае вам не нужно сначала сортировать список; оба min и max обрабатывают несортированные списки просто отлично.

Ответ №2:

Возможно, я слишком много читаю в вопросе, но ответы, предоставленные до сих пор, а также собственный ответ OP, неверны, если arr имеют повторяющиеся элементы, такие как [1,2,2,6] . Итак, правильный ответ: «заимствование» кода обработки ошибок у @chepner:

 def consecutive(arr):
    if not arr:
        raise ValueError("List is empty")

    minimum = min(arr)
    maximum = max(arr)

    diff = maximum - minimum - len(set(arr))   1

    return diff
 

Здесь set(arr) возвращаются уникальные элементы arr