我正在尝试通过用列表推导,生成器和迭代器替换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
谢谢。
答案 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]