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

eag*_*arn 3 python list-comprehension list while-loop

我有一点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]
>>> 
Run Code Online (Sandbox Code Playgroud)

Cor*_*man 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!!
Run Code Online (Sandbox Code Playgroud)

如果你试图为列表中的每个元素做一些事情 - 列表理解是一个很好的选择 - 过滤(测试每个元素的真/假),翻译等,其中操作对于每个元素是独立的(理论上,可以经常被并行化).它在循环中处理和改变状态的循环并不是很好,当你尝试时它们通常看起来很难看.在这种特殊情况下,您只需查看列表中的8个项目,因为您手动计算要查看的索引.在列表理解的情况下,你至少要看所有33.

我不知道这是否是你的动力,但如果是,那就把它留作循环.毕竟Python循环并不坏!