Python:用列表推导式或迭代器建立列表

Python: Establishing List with List Comprehensions or Iterators

我正在尝试通过用列表理解、生成器和迭代器替换 for 循环来改进我的编码和算法性能。

我很难思考如何在 itertools 中实施这些工具,如果您能提供任何帮助,我将不胜感激。

我正在尝试为一定范围的索引初始化一个值为 0 的列表。这是我想出的两种方法:

count_list = [0 for index in range(4 ** k)]

total_index = list(range(4 ** k))
count_list = [0 for index in total_index]

(k表示4个字母组成的单词中数字字母的整数)

当我对 Python 3.4 中的代码进行计时时,事实证明,第一个,使用生成器是一种单独查看时明显更快的方法,然而,当我不得不为另一个循环重用 4 ** k 索引时,这些方法最终以大致相同的速度计时。

我一直在努力弄清楚如何使用迭代器来复制此初始化。我知道如果我想创建索引中所有数字的列表,我可以只使用 list(range()) 或者我可以使用

index_list = [index for index, values in enumerate(words)]

我只是不确定如何使用类似的方法将值 0 分配给每个元素。

我也想知道如何使用列表理解来摆脱这个 for 循环。我猜我需要像地图这样的东西,但我不确定如何实现。

for index in range(4 ** k):
    if frequency_array[index] >= t:
        clump[index] = 1

谢谢。

尝试 [0] * 4**k 用零初始化列表。

简单基准测试:

~/Dev/Python/test   python -m timeit '[0] * 1000'
100000 loops, best of 3: 5.15 usec per loop

~/Dev/Python/test   python -m timeit '[0 for index in range(1000)]'

10000 loops, best of 3: 41.9 usec per loop

要用 0 初始化您的列表:

>>> my_list = [0] * 10
>>> my_list
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

如果你想使用 list 理解而不是 for 循环,你可以这样做:

>>>t = 3
>>>l = [1,2,3,1,2,3,1,2,3,3,2,1]
>>>new_list = [1 if l[i] >= t else l[i] for i in range(len(l))]
>>>new_list
[1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1]

此外,您可以使用 AND - OR 组合,这样:

>>>new_list = [l[i] >= t and 1 or l[i] for i in range(len(l))]
>>>new_list
[1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1]