[英]Repeating elements of a list n times
How do I repeat each element of a list n
times and form a new list?如何将列表中的每个元素重复
n
次并形成一个新列表? For example:例如:
x = [1,2,3,4]
n = 3
x1 = [1,1,1,2,2,2,3,3,3,4,4,4]
x * n
doesn't work x * n
不起作用
for i in x[i]:
x1 = n * x[i]
There must be a simple and smart way.必须有一个简单而聪明的方法。
The ideal way is probably numpy.repeat
:理想的方式可能是
numpy.repeat
:
In [16]:
x1=[1,2,3,4]
In [17]:
np.repeat(x1,3)
Out[17]:
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
In case you really want result as list, and generator is not sufficient:如果你真的想要结果作为列表,而生成器是不够的:
import itertools
lst = range(1,5)
list(itertools.chain.from_iterable(itertools.repeat(x, 3) for x in lst))
Out[8]: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
You can use list comprehension:您可以使用列表理解:
[item for item in x for i in range(n)]
>>> x = [1, 2, 3, 4]
>>> n = 3
>>> new = [item for item in x for i in range(n)]
#[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
A simpler way to achieve this to multiply the list x
with n
and sort the resulting list.实现此目的的更简单方法是将列表
x
与n
相乘并对结果列表进行排序。 eg例如
>>> x = [1,2,3,4]
>>> n = 3
>>> a = sorted(x*n)
>>> a
>>> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
A nested list-comp works here:一个嵌套的 list-comp 在这里工作:
>>> [i for i in range(10) for _ in xrange(3)]
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9]
Or to use your example:或者使用您的示例:
>>> x = [1, 2, 3, 4]
>>> n = 3
>>> [i for i in x for _ in xrange(n)]
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
[myList[i//n] for i in range(n*len(myList))]
This will solve your issue:这将解决您的问题:
x=[1,2,3,4]
n = 3
x = sorted(x * n)
import itertools
def expand(lst, n):
lst = [[i]*n for i in lst]
lst = list(itertools.chain.from_iterable(lst))
return lst
x=[1,2,3,4]
n=3
x1 = expand(x,3)
print(x1)
Gives:给出:
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
Explanation:解释:
Doing, [3]*3
gives the result of [3,3,3]
, replacing this with n
we get [3,3,3,...3] (n times)
Using a list comprehension we can go through each elem of the list and perform this operation, finally we need to flatten the list, which we can do by list(itertools.chain.from_iterable(lst))
这样做,
[3]*3
给出了[3,3,3]
的结果,用n
替换它我们得到[3,3,3,...3] (n times)
使用列表理解我们可以遍历每个列表的元素并执行此操作,最后我们需要将列表展平,我们可以通过list(itertools.chain.from_iterable(lst))
zAxe=[]
for i in range(5):
zAxe0 =[i] * 3
zAxe +=(zAxe0) # append allows accimulation of data
way 1:方式一:
def foo():
for j in [1, 3, 2]:
yield from [j]*5
way 2:方式2:
from itertools import chain
l= [3, 1, 2]
chain(*zip(*[l]*3))
way 3:方式3:
sum(([i]*5 for i in [2, 1, 3]), [])
If you want to modify the list in-place, the best way is to iterate from the back and assign a slice of what was previously one item to a list of that item n
times.如果你想就地修改列表,最好的方法是从后面迭代,并将之前一个项目的一部分分配给该项目的列表
n
次。
This works because of slice assignment:这是因为切片分配:
>>> ls = [1, 2, 3]
>>> ls[0: 0+1]
[1]
>>> ls[0: 0+1] = [4, 5, 6]
>>> ls
>>> [4, 5, 6, 2, 3]
def repeat_elements(ls, times):
for i in range(len(ls) - 1, -1, -1):
ls[i: i+1] = [ls[i]] * times
Demo usage:演示用法:
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> repeat_elements(b, 3)
>>> b
[1, 1, 1, 2, 2, 2, 3, 3, 3]
>>> a
[1, 1, 1, 2, 2, 2, 3, 3, 3]
(If you don't want to modify it in-place, you can copy the list and return the copy, which won't modify the original. This would also work for other sequences, like tuple
s, but is not lazy like the itertools.chain.from_iterable
and itertools.repeat
method) (如果你不想就地修改它,你可以复制列表并返回副本,这不会修改原始的。这也适用于其他序列,如
tuple
s,但不像tuple
那样懒惰itertools.chain.from_iterable
和itertools.repeat
方法)
def repeat_elements(ls, times):
ls = list(ls) # Makes a copy
for i in range(len(ls) - 1, -1, -1):
ls[i: i+1] = [ls[i]] * times
return ls
x=[1,2,3,4]
def f11(x,n):
l=[]
for item in x:
for i in range(n):
l.append(item)
return l
f11(x,2)
If working with array is okay,如果使用数组没问题,
np.array([[e]*n for e in x]).reshape(-1)
In my opinion it is very readable.在我看来,它非常具有可读性。
For base Python 2.7:对于基础 Python 2.7:
from itertools import repeat
def expandGrid(**kwargs):
# Input is a series of lists as named arguments
# output is a dictionary defining each combination, preserving names
#
# lengths of each input list
listLens = [len(e) for e in kwargs.itervalues()]
# multiply all list lengths together to get total number of combinations
nCombos = reduce((lambda x, y: x * y), listLens)
iDict = {}
nTimesRepEachValue=1 #initialize as repeating only once
for key in kwargs.keys():
nTimesRepList=nCombos/(len(kwargs[key])*nTimesRepEachValue)
tempVals=[] #temporary list to store repeated
for v in range(nTimesRepList):
indicesToAdd=reduce((lambda x,y: list(x)+list(y)),[repeat(x, nTimesRepEachValue) for x in kwargs[key]])
tempVals=tempVals+indicesToAdd
iDict[key] = tempVals
# Accumulating the number of times needed to repeat each value
nTimesRepEachValue=len(kwargs[key])*nTimesRepEachValue
return iDict
#Example usage:
expandedDict=expandGrid(letters=["a","b","c","d"],nums=[1,2,3],both=["v",3])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.