Frage

Ich habe eine Funktion wie

def f():
    ...
    ...
    return [list1, list2]

Gibt eine Liste von Listen

[[list1.item1,list1.item2,...],[list2.item1,list2.item2,...]]

wenn ich nun wie folgt vor:

for i in range(0,2):print f()[i][0:10]

es funktioniert und drucken Sie die Listen in Scheiben geschnitten

aber wenn ich tun

print f()[0:2][0:10]

dann druckt er die Listen der [00.10] Slicing ignoriert.

Gibt es eine Möglichkeit, die zweite Form der Arbeit zu machen oder muss ich eine Schleife haben jedes Mal, um das gewünschte Ergebnis zu bekommen?

War es hilfreich?

Lösung

Der Grund, warum diese beiden verhalten sich anders, weil f()[0:2][0:10] funktioniert wie folgt:

  1. f() gibt Ihnen eine Liste von Listen.
  2. [0:2] gibt Ihnen eine Liste mit den ersten beiden Elemente in der Liste der Listen enthält. Da die Elemente in der Liste der Listen Listen sind, ist dies auch eine Liste von Listen.
  3. [0:10] gibt Ihnen eine Liste mit den ersten zehn Elemente in der Liste der Listen enthält, die in Schritt 2 erstellt wurde.

Mit anderen Worten beginnt f()[0:2][0:10] mit einer Liste von Listen, nimmt dann eine Unterliste dieser Liste von Listen (die auch eine Liste von Listen ist), und nimmt dann eine Unterliste der zweiten Liste von Listen (die auch eine Liste der Listen).

Im Gegensatz dazu extrahiert f()[i] tatsächlich das i-te Element aus der Liste der Listen, die nur eine einfache Liste (nicht eine Liste von Listen). Dann, wenn Sie [0:10] anwenden, werden Sie es auf die einfache Liste anwenden, dass Sie von f()[i] bekommen und nicht auf eine Liste von Listen.

Das Endergebnis ist, dass jede Lösung, die das gewünschte Verhalten gibt, wird ein einzelnes Array-Element wie [i] an einem gewissen Punkt zugreifen müssen, anstatt arbeiten nur mit Scheiben wie [i:j].

Andere Tipps

Die zweite Scheibe Scheiben die Sequenz von der ersten Scheibe zurück, also ja, Sie Schleife irgendwie um Scheibe haben im Bereich:

[x[0:10] for x in f()[0:2]]

Eine pythonic Schleife wäre:

for list in f()[0:2]:
    print list[0:10]

Aber je nachdem, was Sie erreichen wollen, Liste Verständnis könnte noch besser sein.

Oder Sie nutzen Pythons map() Funktion:

def print_sub(x):
    print x[0:10]

map(print_sub, f()[0:2])

Eine oder andere Weise, gibt es keinen Weg, um nicht Iterierte über die Liste und erreichen das gewünschte Ergebnis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top