Из этого ответа я заметил, что код
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
, и поэтому это занимает значительно больше времени, чем использование вложенных циклов for. Используя совет из сообщения, указанного выше (которое я, вероятно, не совсем понимаю), я сделал
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: Стоит ли вообще делать это как понимание списка? Единственная причина в том, что я читал, что понимание списков обычно немного быстрее, чем вложенные циклы for. С 2 миллионами точек данных каждая секунда на счету.
Вопрос 2: Если да, то как мне включить оператор break
в понимание списка?
Вопрос 3: Какая ошибка возникла при использовании next
так, как я это делал?
Большое спасибо за ваше время и любезную помощь.
next()
используется, чтобы взять первый элемент списка и эффективно отбросить остальную часть списка. В идеале Python создает только те элементы, которые вы запрашиваете, и если вы никогда не пытаетесь просмотреть остальную часть списка, он никогда не вычисляется. А как насчетnew_list3 = [next(feature['properties'] for feature in feature_list if shape(feature['geometry']).contains(Point(long_list[i], lat_list[i]))) for i in xrange(1000)]
? - person TessellatingHeckler   schedule 08.07.2016