我有一小段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/