Frage Bedingtes Auflisten von Elementen in Python


Ich möchte diese Elemente in einer Iterablenz aufzählen, die eine bestimmte Bedingung erfüllen. Ich habe so etwas probiert

[(i,j) for i,j in enumerate(range(10)) if (3 < j) and (j < 8)]

(das versucht, die Zahlen zwischen 4 und 7 aufzuzählen, nur um ein Beispiel zu nennen). Daraus erhalte ich das Ergebnis

[(4, 4), (5, 5), (6, 6), (7, 7)]

Was ich gerne bekommen würde ist

[(0, 4), (1, 5), (2, 6), (3, 7)]

Gibt es einen pythischen Weg, um das gewünschte Ergebnis zu erzielen?

Beachten Sie, dass ich im aktuellen Problem, an dem ich arbeite, nicht im Voraus weiß, wie viele Artikel die Bedingung erfüllen.


6
2018-05-21 13:18


Ursprung


Antworten:


Führen Sie die letzte Enumeration durch, damit die Indizes von 0 ausgehen.

enumerate(j for j in range(10) if (3 < j) and (j < 8))

Wenn Sie die Liste benötigen, anstatt das Objekt aufzuzählen, wickeln Sie einfach all dies ein list()


13
2018-05-21 13:21



Sie können die Filterung in einem Generator durchführen und anschließend die Enumeration für das Ergebnis dieses Ausdrucks durchführen.

>>> [(index,value) for index,value in enumerate(j for j in range(10) if (3 < j) and (j < 8))]
[(0, 4), (1, 5), (2, 6), (3, 7)]

Oder gleichwertig enumerate wird Tupel von ergeben (index, value) schon kannst du benutzen

>>> list(enumerate(j for j in range(10) if (3 < j) and (j < 8)))
[(0, 4), (1, 5), (2, 6), (3, 7)]

4
2018-05-21 13:20



Warum du falsch liegst: du bekommst das Ergebnis, dann filtere es.

[(i,j) for i,j in enumerate(range(10))] wird bekommen [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]Dann benutzt du if (3 < j) and (j < 8)(j ist der zweite Punkt im Tupel), also wäre das Ergebnis [(4, 4), (5, 5), (6, 6), (7, 7)]

Was Sie tun sollten: Filtern Sie die übergebene Sequenz range() zuerst.

Das bedeutet: Wenn Sie beispielsweise die Zahlen zwischen 4 und 7 aufzählen möchten, sollten Sie zuerst die Filterung durchführen

>>> [j for j in range(10) if 3 < j < 8]
[4, 5, 6, 7]

dann gibst du es weiter enumerate:

>>> list(enumerate([4, 5, 6, 7]))
[(0, 4), (1, 5), (2, 6), (3, 7)]

Also sollte die Lösung sein:

>>> list(enumerate(i for in range(10) if 3 < i < 8))
[(0, 4), (1, 5), (2, 6), (3, 7)]

Mit einem Wort, erinnere dich einfach daran mach die Filterung zuerst.


2
2018-05-21 13:52