Hoe herhaal ik elk element van een lijst n
keer en maak ik een nieuwe lijst? Bijvoorbeeld:
x = [1,2,3,4]
n = 3
x1 = [1,1,1,2,2,2,3,3,3,4,4,4]
x * n
werkt niet
for i in x[i]:
x1 = n * x[i]
Er moet een eenvoudige en slimme manier zijn.
Antwoord 1, autoriteit 100%
De ideale manier is waarschijnlijk 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])
Antwoord 2, autoriteit 47%
In het geval je echt resultaat als lijst wilt, en generator niet voldoende is:
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]
Antwoord 3, autoriteit 42%
U kunt lijstbegrip gebruiken:
[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]
Antwoord 4, autoriteit 12%
Een eenvoudigere manier om dit te bereiken is door de lijst x
te vermenigvuldigen met n
en de resulterende lijst te sorteren. bijv.
>>> x = [1,2,3,4]
>>> n = 3
>>> a = sorted(x*n)
>>> a
>>> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
Antwoord 5, autoriteit 6%
Een geneste lijst-comp werkt hier:
>>> [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]
Of om uw voorbeeld te gebruiken:
>>> 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]
Antwoord 6, autoriteit 3%
Dit lost je probleem op:
x=[1,2,3,4]
n = 3
x = sorted(x * n)
Antwoord 7, autoriteit 2%
[myList[i//n] for i in range(n*len(myList))]
Antwoord 8
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)
Geeft:
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
Uitleg:
Doen, [3]*3
geeft het resultaat van [3,3,3]
, dit vervangen door n
we krijgen [3,3,3,...3] (n times)
Met behulp van een lijstbegrip kunnen we door elk element van de lijst gaan en deze bewerking uitvoeren, ten slotte moeten we de lijst afvlakken, die we kan doen door list(itertools.chain.from_iterable(lst))
Antwoord 9
zAxe=[]
for i in range(5):
zAxe0 =[i] * 3
zAxe +=(zAxe0) # append allows accimulation of data
Antwoord 10
manier 1:
def foo():
for j in [1, 3, 2]:
yield from [j]*5
manier 2:
from itertools import chain
l= [3, 1, 2]
chain(*zip(*[l]*3))
manier 3:
sum(([i]*5 for i in [2, 1, 3]), [])
Antwoord 11
Als u de lijst ter plekke wilt wijzigen, kunt u het beste vanaf de achterkant herhalen en een deel van wat voorheen één item was, toewijzen aan een lijst van dat item n
keer.
Dit werkt vanwege de slice-toewijzing:
>>> 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
Demogebruik:
>>> 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]
(Als u het niet ter plaatse wilt wijzigen, kunt u de lijst kopiëren en de kopie retourneren, waardoor het origineel niet wordt gewijzigd. Dit zou ook werken voor andere reeksen, zoals tuple
s, maar is niet lui zoals de itertools.chain.from_iterable
en itertools.repeat
methode)
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
Antwoord 12
Voor basis 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])