简体   繁体   English

将列表的元素重复 n 次

[英]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.实现此目的的更简单方法是将列表xn相乘并对结果列表进行排序。 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_iterableitertools.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.

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