2016-01-19 2 views
1

Я пытаюсь преобразовать этот цикл с вложенным оператором if в понимание списка в python. Я думаю, что мне трудно увидеть шаблон в списках. Для контекста описанный ниже цикл просматривает массив с именем ibi_a и увеличивает rowCount, если каждый проверенный им индекс удерживает значение меньше переменной antStart.Как преобразовать этот цикл в понимание списка?

rowCount = 0 
for row in range(0,len(ibi_a)): 
    if ((float(ibi_a[row][timeStampCol])) < antStart): 
     rowCount = rowCount+1 #increase rowCount to search for index of antStart 

Я пробовал следующий код, не повезло.

rowCount = 0 
rowCount = [rowCount+1 for row in range(0,len(ibi_a)) if ((float(ibi_a[row][timeStampCol])) < antStart] 

ответ

3

Сводные списки предназначены для генерации списков, что не является вашим циклом for. Вы могли бы это сделать, если вы хотите:

rowCount = sum((float(row[timeStampCol]) < antStart) for row in ibi_a) 

sum действует как счетчик на логических значений.

0

Это неправильное использование понятий в списке. Они предназначены для - как следует из названия - создания списков; то, что вы хотите сделать, это условное увеличение переменной. Придерживайтесь своей петли.

1

Вы не увеличили бы счет в понимании списка; вы бы просто составить список всех элементов, которые соответствуют вашему состоянию, и проверьте длину Листа:

rowCount = len([i for i in ibi_a if float(i[timeStampCol]) < antStart]) 

Как и в стороне, если у вас нет какой-то конкретной причины, чтобы создать range и переменную счетчик (row) , гораздо лучше зациклиться на i in ibi_a, даже в вашем исходном цикле for. Я бы выбрал более подходящее имя переменной для i, но я понятия не имею, что означает «ibi_a» или что представляют его элементы.

+0

'len' не работает с генераторами – Copperfield

+0

@Copperfield Упс. :) – deceze

1

Согласен с Даниэлем, иногда понимание списка может быть использовано для достижения лучшей скорости. Обычная симпатичная против быстрее, но, разумеется, это быстрее, чем нужно. Я смоделировал подобный цикл и поставил его как в listcomp и loop, так и в тот же момент. Поэтому я думаю, что вам лучше держать его как петлю. Все еще и интересные упражнения.

import random 

l = [random.randrange(1, 100) for i in xrange(10000000)] 
antStart = 30 
def listcomp(): 
    rowCount = len([i for i in l if i < antStart]) 

def usingLoop(): 
    rowCount = 0 
    for i in l: 
     if i < antStart: 
      rowCount = rowCount+1 

import timeit 
print "list comp : ",timeit.timeit(listcomp, number=100) 
print "loop : ",timeit.timeit(usingLoop, number=100) 

Результатов были:

Item count : 10^6 
list comp : 3.24901601876 s 
loop : 3.13708115184 s 

Item count : 10^7 
list comp : 35.7664684531 s 
loop : 31.1584190731 s 

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

Смежные вопросы