Itt van egy iteratív verzió (eredetileg Artsiom Rudzenka ihlette), amely a helyben módosítja a listát szelet hozzárendeléssel, ahelyett, hogy minden egyes lépésnél új listát hozna létre. Érdekes módon a listán csak egyszer kell átmenni! A enumerate()
használata kissé szokatlan; Arra használom, hogy nyomon követhessek egy indexet egy listába, amely növekszik, ahogy végigfutom rajta, de valójában nem a tényleges listaelemet használom.
def flattened(items, seqtypes=(list, tuple)):
items = items[:] # we will return a copy; remove to mutate original
for i, _ in enumerate(items):
while isinstance(items[i], seqtypes):
items[i:i+1] = items[i]
return items
print flattened([1,2,[3,4,[5,6,7,[8]]],[9],10])
Generátor verzió:
def flattener(items, seqtypes=(list, tuple)):
items = items[:]
for i, _ in enumerate(items):
while isinstance(items[i], seqtypes):
items[i:i+1] = items[i]
yield items[i]
print list(flattener([1,2,[3,4,[5,6,7,[8]]],[9],10]))
Itt van egy list
alosztály, amelynek flatten()
metódusa van. A sort()
és reverse()
metódusokhoz hasonlóan ez is mutálja a listát, és a None
értéket adja vissza.
class listy(list):
def flatten(self, seqtypes=(list, tuple)):
for i, _ in enumerate(self):
while isinstance(self[i], seqtypes):
self[i:i+1] = self[i]
lst = listy([1,2,[3,4,[5,6,7,[8]]],[9],10])
lst.flatten()
print lst
Szerk.: Ezt elég jelentősen leegyszerűsítettem az eredeti verziómhoz képest. Viszont úgy látom, a kérdés lezárva.
13.07.2011