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

use*_*731 11 python arrays loops list emcee

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

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

[
 [x],
 [y,y],
 [z,z,z]
]
Run Code Online (Sandbox Code Playgroud)

我的'for'循环是:

c = [ ]
for i in range (0,len(a)):
    c.append([a[i]]*b[i])
Run Code Online (Sandbox Code Playgroud)

这正是我想要的,但意味着我的代码极其缓慢.我也尝试过天真地将a和b转换为数组并[a]*b希望它能够逐个元素地增加,但没有快乐.

Ash*_*ary 10

你可以zip 在这里使用和列表理解:

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

要么:

>>> [[x for _ in xrange(y)] for x,y in zip(a,b)]
[['x'], ['y', 'y'], ['z', 'z', 'z']]
Run Code Online (Sandbox Code Playgroud)

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]]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 由于用户是新用户,因此明智地指出[x]*y会创建对x的y引用,这在某些情况下可能会有问题.好像一个人被改变了,所有人都可以改变. (3认同)