gpt4 book ai didi

python - 使用嵌套 for 循环的 if 和 break 创建 Python 列表理解

转载 作者:太空狗 更新时间:2023-10-30 02:41:48 24 4
gpt4 key购买 nike

我从 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=1000new_list2 只有 5 个元素)

问题 1:作为列表推导式这样做是否值得?唯一的原因是我读到列表理解通常比嵌套 for 循环快一点。拥有 200 万个数据点,每一秒都很重要。

问题 2:如果是这样,我将如何将 break 语句合并到列表理解中?

问题 3:我在使用 next 时发生了什么错误?

非常感谢您的宝贵时间和帮助。

最佳答案

列表理解不一定比 for 循环快。如果你有这样的模式:

some_var = []
for ...:
if ...:
some_var.append(some_other_var)

那么是的,列表理解比一堆 .append() 更快。但是,您有情有可原的情况。一方面,在 next(...) 的情况下,它实际上是一个生成器表达式,因为它没有 [] 围绕着它。

  • 您实际上并没有创建列表(因此没有使用 .append())。您只是获得一个值。
  • 您的生成器为 xrange(N) 中的每个 i 的每个特征调用一次 Point(long_list[i], lat_list[i]) >,而循环只为每个 i 调用一次。
  • 当然,您的生成器表达式不起作用。

为什么您的生成器表达式不起作用?因为它只找到整体的第一个值。另一方面,循环为每个 i 找到第一个值 。你看到区别了吗?生成器表达式跳出两个循环,但 for 循环只跳出内部循环。


如果您希望稍微提高性能,请使用 itertools.izip()(或在 Python 3 中仅使用 zip()):

from itertools import izip

for long, lat in izip(long_list, lat_list):
point = Point(long, lat)
...

关于python - 使用嵌套 for 循环的 if 和 break 创建 Python 列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38259235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com