gpt4 book ai didi

python - 是否可以将此循环转换为 python 中的列表理解

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:01 25 4
gpt4 key购买 nike

我有一小段code,我想知道它是否可以用list comprehension 编写。 while loop 部分是我感兴趣的压缩部分。

>>> sum=33
>>> final_list=[]
>>> LastCoin=[0, 1, 2, 1, 2, 5, 1, 2, 1, 2, 5, 1, 2,
1, 2, 5, 1, 2, 1, 2, 5, 1, 2, 1, 2, 5, 1, 2, 1, 2, 5, 1, 2, 1]
>>> while sum>0:
... final_list.append(LastCoin[sum])
... sum-=LastCoin[sum]
...
>>> print final_list
[1, 2, 5, 5, 5, 5, 5, 5]
>>>

最佳答案

您尝试使用列表理解有什么充分的理由吗?

我个人看到很多人试图在不属于它们的地方插入列表推导式,因为,你知道,'列表推导式更快 - 它们是原生 C 语言!而你无聊的循环是在解释的 Python 中。这并不总是正确的。

仅作为引用,如果我们将您简洁易读的原始解决方案与两个建议的答案进行比较,您可能会发现您的假设被违反:

In [5]: %%timeit
...: sum=33
...: while sum > 0:
...: final_list.append(LastCoin[sum])
...: sum -= LastCoin[sum]
...:
100000 loops, best of 3: 1.96 µs per loop

In [6]: %%timeit
...: sum=33
...: susu = [sum]
...: susu.extend(x for x in xrange(sum,-1,-1)
...: if x==(susu[-1]-LastCoin[susu[-1]])!=0)
...: fifi = [LastCoin[x] for x in susu]
...:
100000 loops, best of 3: 10.4 µs per loop
# 5x slower

In [10]: %timeit final_list = [LastCoin[reduce(lambda x, y: x - LastCoin[x], range(counter, i, -1))] for i in range(counter -1, 0, -1) if reduce(lambda x, y: x - LastCoin[x], range(counter, i, -1))]
10000 loops, best of 3: 128 µs per loop
# More than 60x slower!!

如果您尝试对列表中的每个元素执行某些操作,则列表理解是一个不错的选择 - 过滤(测试每个元素的真/假)、翻译等,其中每个元素的操作都是独立的(并且,理论上,通常可以并行化)。它不太擅长在循环期间进行处理和更改状态的循环,而且当您尝试时它们通常看起来很难看。在这种特殊情况下,您在浏览列表时只查看 8 个项目,因为您是手动计算要查看的索引。在列表理解的情况下,您至少必须查看所有 33 个。

我不知道这是否是您的动机,但如果是,请将其作为一个循环。 Python 循环并没有那么糟糕!

关于python - 是否可以将此循环转换为 python 中的列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21322004/

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