2015-04-20 2 views
0

Я пытаюсь сделать список из 11 элементовПолучить топ-6 элементов, при условии, что элемент> = 3

Я хочу, чтобы вытолкнуть максимальный элемент только из l[0] в l[5]. в одном из двух условий:

l[5] >= 3 или l[5] больше не существует или None.

l = [2,8,6,2,8,7,9,8,6,7,4] 
max = 0 
maxIndex = 0 
while (l[5] >= 3 or l[5] is None): 
    for x in range(6): 
     if l[x] > max: 
      max = l[x] 
      maxIndex = x 
    l.pop(maxIndex) 
print(l) 

Я получаю сообщение об ошибке:

IndexError: list index out of range 

Я знаю, в какой-то момент l[5] больше не будет существовать, но как я могу создать этот код.

+0

Добавить условие в то время как заявление, которое должно идти первым. Это должно быть: len (l)> 5' – sshashank124

+1

Ваша функция довольно сложная; все, что вам действительно нужно, это ['heapq.nsmallest()'] (https://docs.python.org/2/library/heapq.html#heapq.nsmallest) здесь. –

+0

Вы хотите, чтобы ** top-n (здесь, n = 6), при условии, что x> = 3 **. Как сказал @MartijnPieters, не начинайте с списка в первую очередь, используйте структуру сортировки данных, подобную 'heapq' – smci

ответ

0

Reverse условия:

l = [2,8,6,2,8,7,9,8,6,7,4] 
max = 0 
maxIndex = 0 
while len(l) > 5 or l[5] >= 3: 
    for x in range(6): 
     if l[x] > max: 
      max = l[x] 
      maxIndex = x 
    l.pop(maxIndex) 
print(l) 
+0

Хороший улов, Martijn! – hd1

2

Минимального воспроизводимый код:

l = [1, 2, 3] 
l[3] is None # raises IndexError 
assert len(l) == 3 # len(l) returns 3 

Как вы можете видеть, доступ к несуществующему элементу поднимает IndexError, поэтому правильное условие должно содержать тест длину.

while (len(l) >= 6 and l[5] >= 3): 
0

Я думаю, что это делает все, что вам нужно - возвращает максимум, если есть пятый элемент, и это >=3 или None

>>> l = [2,8,6,2,8,7,9,8,6,7,4] 

>>> max(l[0:5]) if len(l)>5 and (l[5]>=3 or l[5] is None) else None 
8 

>>> l = [1,2,3] 
>>> max(l[0:5]) if len(l)>5 and (l[5]>=3 or l[5] is None) else None 
>>>