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]
我正在尝试通过用列表理解、生成器和迭代器替换 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]