创建给定大小N= l*k
列表的最pythonic方法是什么,其中l
是不同符号的数量(为简单起见为整数),k
是这样的子序列长度:
N=12
,l=4
,k=3
[ 0,0,0, 1,1,1, 2,2,2, 3,3,3 ]
或此举例如N=15
l=3
,k=5
:
[ 0,0,0,0,0, 1,1,1,1,1, 2,2,2,2,2 ]
应该经常调用此函数,因此需要速度。
答案 0 :(得分:6)
使用numpy
即可:
In [23]: import numpy as np
In [26]: a=np.arange(3).repeat(5)
In [27]: a
Out[27]: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2])
或python builtin:
In [29]: [l for l in range(3) for k in range(5)]
Out[29]: [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
答案 1 :(得分:3)
>>> l=3
>>> k=5
>>> [e for i in range(l) for e in [i]*k]
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
答案 2 :(得分:3)
我喜欢这个 lazy 版本(它返回一个迭代器,而不是一个列表,你可以根据需要从中生成值)。
l, k = 3, 5
itertools.chain.from_iterable(itertools.repeat(i, k) for i in xrange(l))
输出:
list(itertools.chain.from_iterable(itertools.repeat(i, k) for i in xrange(l)))
# [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
答案 3 :(得分:2)
也许使用itertools.repeat和itertools.chain.from_iterable?
>>> from itertools.import repeat, chain
>>> k = 3
>>> l = 4
>>> list(chain.from_iterable(list(repeat(x, k)) for x in xrange(l))
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
答案 4 :(得分:0)
>>> sum([[x]*3 for x in xrange(4)], [])
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
将它放入函数中:
def combine(l, k):
return sum([[x]*k for x in xrange(l)], [])
答案 5 :(得分:0)
import itertools
l = 3
k = 5
print(list(itertools.chain(*[[i] * k for i in range(l)])))
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]