【发布时间】:2016-11-10 14:01:46
【问题描述】:
我从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
我希望每个 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])]
当然,这并没有考虑到if 语句中的break,因此比使用嵌套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 时发生了什么错误?
非常感谢您的宝贵时间和热心帮助。
【问题讨论】:
-
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)]呢?
标签: python list-comprehension nested-loops break