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

时间:2015-07-16 23:32:12

标签: python python-3.x generator list-comprehension itertools

我正在尝试通过用列表推导,生成器和迭代器替换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 中对代码进行计时时,事实证明第一个,使用生成器是一个明显更快的方法,当单独查看它时,但是当我不得不重用{{ 1}}另一个循环的索引,方法以大约相同的速度结束时间。

我一直在努力弄清楚我是如何使用迭代器来复制这个初始化的。我知道如果我想创建索引中所有数字的列表,我可以使用4 ** k或者我可以使用

list(range())

我只是不确定如何使用类似的东西为每个元素分配值index_list = [index for index, values in enumerate(words)]

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

for

谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用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]