2017-02-16 6 views
3

Ich versuche, eine Liste von zwei Listen zu ändern. Für jede der beiden Inside-Listen führe ich einige Operationen aus und teile sie in neue Listen auf.
Hier ist ein einfaches Beispiel dafür, was ich versuche zu tun:Ersetzen eines Elements in einer Liste durch mehrere Elemente

[['a', 'b'], ['c', 'd']] --> [['a'], ['b'], ['c', 'd']] 

Derzeit geht mein Algorithmus ['a', 'b'] auf eine Funktion, ob oder ob nicht bestimmt sie in [['a'], ['b']] aufgeteilt werden soll (zum Beispiel auf deren Korrelationen basiert). Die Funktion gibt [['a'], ['b']] zurück, die mir teilt, dass ['a', 'b'] geteilt werden sollte, oder ['a', 'b'] (die ursprüngliche Liste) zurückgibt, die angibt, dass es nicht aufgeteilt werden sollte.

Zur Zeit habe ich so etwas wie diese:

blist = [['a', 'b'], ['c', 'd']] #big list 
slist = [['a'], ['b']]   #small list returned by function 

nlist = [items for i in xrange(len(blist)) for items in (slist if i==0 else blist[i])] 

Dies erzeugt [['a'], ['b'], 'c', 'd'] in Bezug auf den gewünschten Ausgang [['a'], ['b'], ['c', 'd']] gegenüber, die nicht die zweite Liste im ursprünglichen blist nicht verändert. Ich verstehe, warum das passiert - meine zweite Schleife wird in diesem Fall auch auf blist[1] angewendet, aber ich bin mir nicht sicher, wie ich das beheben soll, da ich das Verständnis der Liste nicht vollständig verstehe.

Eine 'pythonische' Lösung ist bevorzugt. Irgendwelche Rückmeldungen würden geschätzt werden, danke!

EDIT: Wie der Titel schon sagt, ich versuche ['a', 'b'] mit ['a'], ['b'] zu 'ersetzen'. So würde Ich mag die ‚Position‘ die gleiche sein, ['a'], ['b'] in der ursprünglichen Liste erscheinen, die vor ['c', 'd']

ERGEBNISSE Danke Christian, Paul und schwobaseggl für Ihre Lösungen! Sie alle arbeiten :)

+0

Sie widersprechen sich. Übergeben Sie Elemente an eine Funktion oder verwenden Sie ein geschachteltes Listenverständnis? Wie auch immer, wenn du Listenkompressen nicht verstehst, warum benutzt du keine einfachen For-Schleifen, bis du es tust? Ich würde. – hop

+0

Sorry, ich meine, dass die Funktion verwendet wird, um zu bestimmen, ob die Liste aufgeteilt ist oder nicht, die geschachtelte Liste Verständnis führt die Änderung/split – AsheKetchum

+0

@hop Ich glaube, ich verstehe einfache for-Schleifen. Ich würde gerne mit Listenerkenntnissen vertrauter sein und ein besseres Verständnis haben. Ich versuche nur etwas Übung zu bekommen. Auch mit "Ich würde" meinen Sie, dass die Verwendung von einfachen For-Loops nur dazu beiträgt, Listen-Comprehensions zu verstehen? Ich verstehe, dass sie Ähnlichkeiten haben, aber wie in meinem Beispiel scheint das Listenverständnis viel kompakter zu sein mit den Aussagen in verschiedenen Ordnungen. Können Sie näher auf die Beziehung zwischen den beiden eingehen? – AsheKetchum

Antwort

1

können Sie slice Zuordnung verwenden:

>> l1 = [[1, 2], [3, 4]] 
>>> l2 = [[1], [2]] 
>>> l1[0:1] = l2 
>>> l1 
[[1], [2], [3, 4]] 

Dies ändert l1, also wenn Sie es, bevor Sie eine Kopie behalten möchten.

Ein anderer Weg, die nicht l1 ändert ist zusätzlich:

>> l1 = [[1, 2], [3, 4]] 
>>> l3 = l2 + l1[1:] 
>>> l3 
[[1], [2], [3, 4]] 
+0

für den Fall, dass 'l2 = [1, 2] ',' l1 [0: 1] = l2 [:] 'gibt l1 selbst zurück? – AsheKetchum

+1

nein, das sollte die Elemente von "l2", die 1 und 2 sind, anstelle des Elementes setzen, das derzeit an Position Null von "l1" liegt, was "[1, 2]" ist, mit anderen Worten, es verliert die Klammern um 1 und 2. –

+0

Was macht eigentlich [:]? Ist es eine Iteration von Elementen? – AsheKetchum

2

Versuchen

... else [blist[i]])] 

eine Liste von Listen zu erstellen.

0

Sie die erwähnten funtion Unter der Annahme, die entscheidet, ob ein Element zu spalten:

def munch(item): 
    if item[0] == 'a': # split 
     return [[item[0]], [item[1]]] 
    return [item] # don't split 

Sie es einfach in s nutzen können for-Schleife.

"Pythonic" ist was auch immer leicht zu lesen und zu verstehen ist. Verwenden Sie Listenübersichten nicht, nur weil Sie es können.

+0

Könnten Sie uns kurz erklären, was Munch hier macht? Ein Beispiel wäre wirklich hilfreich. Vielen Dank! – AsheKetchum

+0

@AsheKetchum: Sie können den Code einfach in die Python-Befehlszeile eingeben und es für sich selbst ausprobieren. – hop

1

Sie könnten Ihre Split-Funktion ändern, um strukturell angemessene Listen zurückzugeben.Dann können Sie ein Verständnis verwenden:

def split_or_not(l): 
    if condition: # split 
    return [l[:1], l[1:]] 
    return [l] # wrap in extra list 

# using map 
nlist = [x for sub_l in map(split_or_not, blist) for x in sub_l] 
# or nested comprehension 
nlist = [x for sub_l in (split_or_not(l) for l in blist) for x in sub_l] 
+0

Das ist ein sehr guter Punkt! Ich habe das erhöht, aber es zeigt nicht, da ich weniger als 15 Reputation haha ​​habe. Ich werde die Rückgabeobjektstrukturen modifizieren. Was passiert außerdem, wenn '[l]' anstelle von 'l' zurückgegeben wird? Benötigt es zusätzliche Zeit, um "l" in eine Liste aufzunehmen? – AsheKetchum

+1

Die neue Liste enthält nur einen Verweis auf die Liste, der Overhead sollte vernachlässigbar sein! – schwobaseggl

+0

Ich sehe, danke für den tollen Vorschlag! :) – AsheKetchum

Verwandte Themen