2017-02-15 4 views
2

Ich versuche, eine Liste in zwei Listen zu teilen. Hier ist die Liste:Python Split-Liste basierend auf Bedingung/wenn sonst Anweisung

L = [3.5, , 7, , 4.5 , 6, , 4,8, , 3.1, , 9, ]

Wenn ich die Liste basierend auf der fett-Nummer (1 oder 2) geteilt werden soll, die immer die gerade Zahl (2x) in den pos sind ition, so dass die Zahlen vor dem 1. Gehen Sie auf eine Liste, und die Zahlen vor 2 gehen in eine andere Liste:

l1 = [3.5, 4.5, 3.1] #bold number = 1 

l2 = [7, 6, 4.8, 9] #bold number = 2 

Auch kann die Frage erstrecken, wenn i+1 fett Zahl gibt es und muss somit i+1 aufgeteilt werden Liste.

Wie sollte ich if - else Anweisungen für die Liste verwenden?

+2

Bitte zeigen Sie Ihre Mühe :) Einfügen Ihres Codes wäre OK – 0Tech

+0

Wie 0Tech sagte, zeigen Sie, was Sie bisher haben. Aber auch klar, sind diese Nummern 1 und 2 Positionen oder Flags. – sten

+1

@Roxanne Ihre Bearbeitung hat den fett gedruckten Text in der "L" -Liste durcheinander gebracht. –

Antwort

5

Sie, dass in einem Schritt 2 Schleife, die löst das vorherige Element in der entsprechenden Liste (ich eine Verknüpfung nahm: wenn der Wert 1, es ist l1 sonst es l2 ist, so ist es ziemlich zerbrechlich ist): unter Verwendung von ternären

l=[3.5, 1 ,7, 2 ,4.5, 1, 6, 2, 4.8, 2 ,3.1,1, 9, 2] 

l1,l2 = [],[] 
for i in range(1,len(l),2): 
    (l1 if l[i]==1 else l2).append(l[i-1]) 

print(l1,l2) 

Ausbeuten:

[3.5, 4.5, 3.1] [7, 6, 4.8, 9] 

Allgemeiner Fall: eine Liste von Listen erstellen, um den maximalen Index nach und Versand den Wert entsprechend dem Index in einer Schleife (l[i]-1 ist 0 Anfangsbuchstaben Index und l[i] ist der Wert einzufügen)

lists = [[] for _ in range(max(l[1::2]))] 

for i in range(1,len(l),2): 
    lists[l[i]-1].append(l[i-1]) 

print(lists) 

Ergebnis:

[[3.5, 4.5, 3.1], [7, 6, 4.8, 9]] 

mehr "pythonic" für den letzten Teil mit itertools.islice statt mit Indizes zu spielen:

import itertools 
for i,v in zip(itertools.islice(l,1,len(l),2),itertools.islice(l,0,len(l),2)): 
    lists[i-1].append(v) 
0

nicht der sauberste Versuch, aber hier gehst du

>>> L=[3.5, 1 ,7, 2 ,4.5, 1, 6, 2, 4.8, 2 ,3.1,1, 9, 2] 
>>> o=zip(L, L[1:])[::2] 
>>> o 
[(3.5, 1), (7, 2), (4.5, 1), (6, 2), (4.8, 2), (3.1, 1), (9, 2)] 
>>> map(lambda x: x[0], filter(lambda x: x[1]%2==0, o)) 
[7, 6, 4.8, 9] 
>>> map(lambda x: x[0], filter(lambda x: x[1]%2!=0, o)) 
[3.5, 4.5, 3.1] 
5

Sie können die neuen Listen in einem Wörterbuch speichern, indem Sie die Kategorienummer als Wörterbuchschlüssel verwenden. Wir verwenden ein Standarddict, um das Erstellen der Listen im Wörterbuch zu vereinfachen.

from collections import defaultdict 

lst = [3.5, 1 ,7, 2, 4.5, 1, 6, 2, 4.8, 2, 3.1, 1, 9, 2] 

# Separate data into different lists based on following number 
d = defaultdict(list) 
it = iter(lst) 
for v, k in zip(it, it): 
    d[k].append(v) 

# Display lists 
for k in sorted(d.keys()): 
    print(k, d[k]) 

Ausgang

1 [3.5, 4.5, 3.1] 
2 [7, 6, 4.8, 9] 

Dieser Code meistert mit einer beliebigen Anzahl von Kategorien.

Wie Jean-François Fabre in den Kommentaren erwähnt, gibt es eine etwas effizientere Möglichkeit, das Drucken in sortierter Reihenfolge durchzuführen.

from collections import defaultdict 

lst = [3.5, 1 ,7, 2, 4.5, 3, 6, 2, 4.8, 3, 3.1, 1, 9, 2] 

# Separate data into different lists based on following number 
d = defaultdict(list) 
it = iter(lst) 
for v, k in zip(it, it): 
    d[k].append(v) 

# Display lists 
for k, v in sorted(d.items()): 
    print(k, v) 

Ausgang

1 [3.5, 3.1] 
2 [7, 6, 9] 
3 [4.5, 4.8] 

Das Herz dieses Algorithmus ist

it = iter(lst) 
for v, k in zip(it, it): 

it = iter(lst) ein Iterator-Objekt aus der Liste erstellt. Wir übergeben dann zwei Kopien dieses Iterators an zip.

Schleifen über zip ergibt Tupel, die die aufeinanderfolgenden Elemente von jedem der Argumente enthalten, die Sie füttern. Mit anderen Worten, wenn Sie zip(a, b, c) bekommt man die ersten Elemente der einzelnen a, b, c, dann erhalten Sie ihre zweiten Elemente usw.

Aber hier haben wir zip zwei Verweise auf die it Iterator übergeben. So, wenn zip liest die nächsten Artikel von jedem der beiden it s seine Arbeit wirklich seinen Weg durch die paarweise Elemente in lst. So erhalten wir auf jeder Schleife der Schleife for aufeinanderfolgende Paare von Elementen von lst.

+0

'für k in sortiert (d.keys()):': Sie besser tun würden 'für k, v in sortiert (d.Items()):' so dass Sie nicht tun müssen, um 'd [k]' in deiner Schleife. –

+0

@ Jean-FrançoisFabre Danke. Warum habe ich nicht daran gedacht? ;) Und 'für t in sortierte (d.items()): print (* t)' ist eine weitere Option. –