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

标签 python list while-loop list-comprehension

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

相关文章:

python - Django - 基于函数的 View 的自定义权限

Python 多元简单线性回归

r - 从 R 中的列表列表构建数据框的最佳方法

Python while 循环。这个构造叫什么?

java - 索引像素来为图片的某些位置着色

c - 两个文件在C程序中分别输出一行

python - 获取给定条件成立的数据帧的列号

用于测量电池时间的python脚本

Python,两个列表相同的 "for"

Python列表,保留列表的所有子列表中存在的所有值