2015-05-01 4 views
2

Итак, я пытаюсь выяснить эту проблему, и я не могу понять, почему она не работает.Функция Python со списками и наборами

Предпосылка заключается в том, что вам предоставлен список входных данных, и вам нужно найти второе наименьшее значение. Список может иметь любое количество целых чисел и может повторять значения; вы не можете изменить список.

Мой код:

def second_min(x): 
    input_list = list(x) 
    print input_list 
    list_copy = list(input_list) 
    list_set = set(list_copy) 
    if len(list_set) > 1: 
     list_copy2 = list(list_set) 
     list_copy2 = list_copy2.sort() 
     return list_copy2[1] 
    else: 
     return None 

print second_min([4,3,1,5,1]) 
print second_min([1,1,1]) 

выходы для этих двух входов:

3 
None 

Это дает мне ошибки на линии 9 и 13.

TypeError: 'NoneType' object has no attribute '__getitem__' 

Спасибо!

ответ

5
list_copy2 = list_copy2.sort() 

.sort() сортирует список на месте и возвращает None. Итак, вы сортируете список, а затем отбрасываете его. Вы хотите просто:

list_copy2.sort() 

Или:

list_copy2 = sorted(list_set) 

sorted всегда возвращает список, так что вы можете использовать его для сортировки набора и преобразовать его в список в один шаг!

+0

Большое спасибо! Теперь он работает отлично. – Mariankka

+0

Простите, я читал неправильно, что вы сказали @kindall. Я читал это быстро – RafaelC

2

Вам необходимо использовать sorted вместо sort. sorted возвращает новый список, то есть отсортированную версию оригинала. sort будет сортировать список на месте и возвращает None после этого.

def second_min(x): 
    if len(x) > 1: 
     return sorted(x)[1] 
    else: 
     return None 

>>> second_min([4,3,1,5,1]) 
1 
0

Помогите, я не могу использовать отсортированные! Это не разрешено!

def second_min(li): 
    if len(li) < 2: 
     return None 
    it = iter(li) 
    a, b = next(it), next(it) 
    next_lowest, lowest = max(a, b), min(a, b) 
    for x in it: 
     if x < next_lowest: 
      if x < lowest: 
       lowest, next_lowest = x, lowest 
      else: 
       next_lowest = x 
    return next_lowest 
Смежные вопросы