我注意到从
this回答该代码
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
我希望每个点都与要素列表中的单个多边形相关联.因此,一旦找到包含该点的多边形,则使用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])]
当然,这并没有考虑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循环快一点.每秒有200万个数据点.
问题2:如果是这样,我如何在列表理解中加入break语句?
问题3:以我的方式使用next时出现的错误是什么?
非常感谢你的时间和善意的帮助.