2017-08-17 2 views
-11

ich die folgende Liste haben:verschachtelte Listen aus einer Liste generieren

data = [0, 1, 0, 1, 0, 1] 

Ich möchte eine Schleife schreiben, die mir die folgenden Listen geben:

[0] 
[0, 1] 
[0, 1, 0] 
[0, 1, 0, 1] 
[0, 1, 0, 1, 0] 

Das heißt, ich möchte insgesamt fünf Listen (eine weniger als die Länge der ursprünglichen Liste). Allerdings muss der Code flexibel genug sein, dass unabhängig von der Länge der Liste das erste Element, dann die ersten beiden Elemente usw. als einzelne Listen ausgegeben werden, bis die Länge der ursprünglichen Liste minus eins erreicht wird .

Wie kann ich Code schreiben, um dies zu tun? Gibt es etwas Eleganteres als die offensichtliche For-Schleife?

+5

Ok, und was ist Ihre Frage? Was hast du probiert? Was schief gelaufen ist? – Carcigenicate

+0

Wenn eine dieser Antworten Ihnen geholfen hat, markieren Sie diese bitte als akzeptiert. –

Antwort

-1
for i,x in enumerate(list): 
    print (list[:i]) 
+3

Warum 'pass '? Das ergibt keinen Sinn. – bendl

+0

@bendl Ich füge immer Pass am Ende einer Schleife hinzu. Ich habe es so erlernt. Warum nicht, was ist falsch daran? –

+2

Es gibt keinen Grund, dass es da ist. Die Idee von Python ist nichts ohne Zweck zu schreiben. Es ist auch verwirrend. 'pass' sollte ** nur ** verwendet werden, wenn der Code nicht ohne ihn läuft. Wenn es da ist, kommt später jemand vorbei und denkt "Warum funktioniert dieser Code nicht ohne eine" Pass "Aussage?" – bendl

5

Sie können ein Listenverständnis verwenden. Simpel und einfach.

In [652]: [list_[:i] for i in range(1, len(list_))] 
Out[652]: [[0], [0, 1], [0, 1, 0], [0, 1, 0, 1], [0, 1, 0, 1, 0]] 

Dies ist die Slick Äquivalent einer for Schleife das gleiche tun:

In [654]: output = [] 
    ...: for i in range(1, len(list_)): 
    ...:  output.append(list_[:i]) 
    ...: print(output) 
    ...: 
[[0], [0, 1], [0, 1, 0], [0, 1, 0, 1], [0, 1, 0, 1, 0]] 
0

Hier ist eine Möglichkeit, es zu tun:

my_list = [0, 1, 0, 1, 0, 1] 

def one_by_one(l): 
    previous = [] 
    total = len(l) - 1 
    for i, element in enumerate(l): 
     if i != total: 
      previous.append(element) 
      print previous 

one_by_one(my_list) 

Hier erstelle ich eine Funktion, one_by_one, welches über die Liste iteriert, die es als Parameter nimmt. Während der Iteration hängt es jeden Listenwert an eine leere Liste an und druckt, was es bisher hat - nur wenn das Element nicht das letzte ist. Die Ausgabe ist genau das, was Sie wollten:

[0] 
[0, 1] 
[0, 1, 0] 
[0, 1, 0, 1] 
[0, 1, 0, 1, 0] 
[0, 1, 0, 1, 0, 1] 

Diese Funktion druckt nur die Ausgabe. Wenn Sie diese Listen für die spätere Verwendung behalten möchten, würde das etwas anders aussehen. Hoffe das hilft!

2

nur eine dumme Alternative für Spaß ...

>>> list(itertools.accumulate([x] for x in data))[:-1] 
[[0], [0, 1], [0, 1, 0], [0, 1, 0, 1], [0, 1, 0, 1, 0]] 
+0

Ah, das ist schön. Ich kratzte mich am Kopf und versuchte herauszufinden, wie man "Itertools.accumulate" hier verwenden kann. +1 –

Verwandte Themen