я заметил из this ответа, что кодСоздание списка понимания Python с, если и порвать с вложенным для петель
for i in userInput:
if i in wordsTask:
a = i
break
может быть записан в виде списка понимания следующим образом:
next([i for i in userInput if i in wordsTask])
У меня есть аналогичная проблема, которая заключается в том, что я хотел бы написать следующий (упрощенный из оригинальной проблемы) код в терминах понимания списка:
for i in xrange(N):
point = Point(long_list[i],lat_list[i])
for feature in feature_list:
polygon = shape(feature['geometry'])
if polygon.contains(point):
new_list.append(feature['properties'])
break
Я ожидаю, что каждый point
будет связан с одним полигоном из списка функций. Следовательно, как только найден многоугольник, содержащий эту точку, для перехода к следующей точке используется break
. Поэтому new_list
будет иметь точно N
элементов.
Я написал это как список понимание следующим образом:
new_list = [feature['properties'] for i in xrange(1000) for feature in feature_list if shape(feature['geometry']).contains(Point(long_list[i],lat_list[i])]
Конечно, это не учитывает break
в if
заявления, и, следовательно, значительно больше, чем требуется для использования вложенных циклов. Пользуясь советами из вышеприведенного-сшитый пост (который я, вероятно, не в полной мере понять), я сделал
new_list2 = next(feature['properties'] for i in xrange(1000) for feature in feature_list if shape(feature['geometry']).contains(Point(long_list[i],lat_list[i]))
Однако new_list2
имеет гораздо меньше, чем N элементов (в моем случае, N=1000
и new_list2
имели только 5 элементов)
Вопрос 1: Стоит ли это делать как понимание списка? Единственная причина в том, что я читал, что понимание списков обычно немного быстрее, чем вложенные для циклов. С 2 миллионами точек данных каждая секунда считается.
Вопрос 2: Если да, то как я могу включить заявление break
в понимании списка?
Вопрос 3: Какова была ошибка при использовании next
в том, как я это делал?
Благодарим вас за ваше время и помощь.
'next()' используется, чтобы взять первый элемент списка и эффективно выбросить остальную часть списка. В идеале, Python создает только те элементы, которые вы просите, и если вы никогда не пытаетесь просмотреть остальную часть списка, он никогда не вычисляется. Что касается 'new_list3 = [next (функция ['properties'] для функции в feature_list, если shape (feature ['geometry']) содержит (Point (long_list [i], lat_list [i]))) для i в xrange (1000)] '? – TessellatingHeckler