python - 创建单个列表项的列表乘以 n 次

标签 python arrays list loops emcee

我是 Python 的新手,认为这应该是一个相当普遍的问题,但找不到解决方案。我已经看过 this page并发现它对一个项目有帮助,但我正在努力将示例扩展到多个项目而不使用“for”循环。我正在通过 Emcee 为 250 名步行者运行这段代码,所以我正在寻找最快的方法。

我有一个数字列表,a = [x,y,z] 我想重复 b = [1,2,3] 次(对于示例),所以我最终得到了一个列表列表:

[
 [x],
 [y,y],
 [z,z,z]
]

我的“for”循环是:

c = [ ]
for i in range (0,len(a)):
    c.append([a[i]]*b[i])

这完全符合我的要求,但意味着我的代码非常慢。我也曾天真地尝试过将 a 和 b 转换为数组并执行 [a]*b,希望它能逐个元素相乘,但没有任何乐趣。

最佳答案

您可以在此处使用 zip 和列表推导式:

>>> a = ['x','y','z']
>>> b = [1,2,3]
>>> [[x]*y for x,y in zip(a,b)]
[['x'], ['y', 'y'], ['z', 'z', 'z']]

或:

>>> [[x for _ in xrange(y)] for x,y in zip(a,b)]
[['x'], ['y', 'y'], ['z', 'z', 'z']]

zip 将首先在内存中创建整个列表,使用 itertools.izip

获取迭代器

如果 a 包含可变对象,如列表或列表的列表,那么您可能必须在此处使用 copy.deepcopy 因为修改一个副本也会更改其他副本.:

>>> from copy import deepcopy as dc
>>> a = [[1 ,4],[2, 5],[3, 6, 9]]
>>> f = [[dc(x) for _ in xrange(y)] for x,y in zip(a,b)]

#now all objects are unique
>>> [[id(z) for z in x] for x in f]
[[172880236], [172880268, 172880364], [172880332, 172880492, 172880428]]

timeit 比较(忽略导入):

>>> a = ['x','y','z']*10**4
>>> b = [100,200,300]*10**4

>>> %timeit [[x]*y for x,y in zip(a,b)]
1 loops, best of 3: 104 ms per loop

>>> %timeit [[x]*y for x,y in izip(a,b)]
1 loops, best of 3: 98.8 ms per loop

>>> %timeit map(lambda v: [v[0]]*v[1], zip(a,b))
1 loops, best of 3: 114 ms per loop

>>> %timeit map(list, map(repeat, a, b))
1 loops, best of 3: 192 ms per loop

>>> %timeit map(list, imap(repeat, a, b))
1 loops, best of 3: 211 ms per loop

>>> %timeit map(mul, [[x] for x in a], b)
1 loops, best of 3: 107 ms per loop

>>> %timeit [[x for _ in xrange(y)] for x,y in zip(a,b)]
1 loops, best of 3: 645 ms per loop

>>> %timeit [[x for _ in xrange(y)] for x,y in izip(a,b)]
1 loops, best of 3: 680 ms per loop

关于python - 创建单个列表项的列表乘以 n 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16881092/

相关文章:

python - 如何计算 Pandas 中列成对相关的 p 值?

python - 将元组列表映射到字典中

python - 如何将列表写入每行两个项目的文件

python正则表达式,剪切多行

python - 如何使用 Python 进行调试

python - PyGTK:移动自定义构建工具提示窗口

java sql列插入

java - 两个整数数组之间的计算

java - 如何将用户输入添加到java中的并行数组?

python - 按顺序为数据框中的多行从列表中分配多个值