简体   繁体   English

重复整数列表

[英]List of repeating integers

What is the most pythonic way to create a list of given size N= l*k where l is the number of different symbols (integers for simplicity) and k is the subsequence length like this: 什么是创建给定大小列表的最pythonic方式N= l*k其中l是不同符号的数量(为简单起见整数), k是子序列长度,如下所示:

N=12 , l=4 , k=3 N=12l=4k=3

[ 0,0,0, 1,1,1, 2,2,2, 3,3,3 ]

or this for example N=15 l=3 , k=5 : 或者这例如N=15 l=3k=5

[ 0,0,0,0,0, 1,1,1,1,1, 2,2,2,2,2 ]

this function should be called very often so speed is desirable. 应该经常调用此函数,因此需要速度。

Using numpy you can do this: 使用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])

or python builtin: 或python内置:

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]
>>> 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]

I like this lazy version (it returns an iterator, not a list, and you can generate values out of it when you want). 我喜欢这个懒惰的版本(它返回一个迭代器,而不是一个列表,你可以在需要时从中生成值)。

l, k = 3, 5
itertools.chain.from_iterable(itertools.repeat(i, k) for i in xrange(l))

It outputs this: 它输出这个:

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]

Perhaps with itertools.repeat and itertools.chain.from_iterable ? 也许使用itertools.repeatitertools.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]
>>> sum([[x]*3 for x in xrange(4)], [])
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

Putting it into a function: 把它放到一个函数中:

def combine(l, k):
   return sum([[x]*k for x in xrange(l)], [])
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]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM