Ist es möglich, 2 (oder mehr) Elemente für jedes Element in einem Listenverständnis zurückzugeben?
Was ich will (Beispiel):
[f(x), g(x) for x in range(n)]
sollte zurückkehren [f(0), g(0), f(1), g(1), ..., f(n-1), g(n-1)]
Also etwas, um diesen Codeblock zu ersetzen:
result = list()
for x in range(n):
result.add(f(x))
result.add(g(x))
python
list-comprehension
Hashmush
quelle
quelle
Antworten:
Timings:
quelle
(f(x), g(x))
. Könnte besser geschrieben sein als :def fg(x): yield x + 2; yield x ** 2; list(chain.from_iterable(fg(x) for x in range(3)))
.chain.from_iterable((func(x) for func in funcs) for x in range(n)))
. Das würde übrigens Khachiks Beschwerde beseitigen. (Obwohl in gewissem Sinne meine und seine in Bezug auf den Prozess im Wesentlichen gleich sind. Wir definieren den inneren Generator einfach anders.)sum(..., [])
Antwort, da es nicht erforderlich ist, die Liste bei jedem + neu zu erstellen (hat also eher eine O (N) -Leistung als eine O (N ^ 2) -Leistung). Ich werde es immer noch verwenden,sum(..., [])
wenn ich einen schnellen Einzeiler möchte oder es eilig habe oder wenn die Anzahl der zu kombinierenden Begriffe begrenzt ist (z. B. <= 10).[y for x in range(n) for y in (f(x), g(x))]
Aber das ist wahrscheinlich langsamer. @ Jamylak Du kannst das auch testen, wenn du willst.Doppellistenverständnis:
Demo:
quelle
for x in range(5): for f in (f1, f2): newlist.append(f(x))
. Früher fand ich sie etwas verwirrend, weil ich immer wieder versuchte, die Reihenfolge umzukehren.Dies entspricht
[f(1),g(1)] + [f(2),g(2)] + [f(3),g(3)] + ...
Sie können sich das auch so vorstellen:
Hinweis: Der richtige Weg ist die Verwendung
itertools.chain.from_iterable
oder das doppelte Listenverständnis. (Es ist nicht erforderlich, die Liste bei jedem + neu zu erstellen, hat also eher eine O (N) -Leistung als eine O (N ^ 2) -Leistung.) Ich werde sie immer noch verwenden,sum(..., [])
wenn ich einen schnellen Einzeiler möchte oder es eilig habe oder wenn die Anzahl der zu kombinierenden Begriffe begrenzt ist (z. B. <= 10). Deshalb erwähne ich es hier immer noch mit dieser Einschränkung. Sie können auch Tupel verwenden:((f(x),g(x)) for ...), ()
(oder laut Khachiks Kommentar einen Generator fg (x), der ein Zwei-Tupel ergibt).quelle
[f(1),g(1)] + [f(2),g(2)] + [f(3),g(3)] + ...
sum()
auf diese Weise als Antimuster, und ich sehe keine Rechtfertigung dafür, es unter welchen Umständen auch immer zu verwenden. Der Code in Ihrer anderen Antwort ist weniger tippend, so dass selbst die Ausrede "wenn ich einen schnellen Einzeiler möchte oder es eilig habe" es nicht wirklich schneidet.Diese Lambda-Funktion komprimiert zwei Listen zu einer einzigen:
Beispiel:
quelle
Ich weiß, dass OP nach einer Lösung für das Listenverständnis sucht, möchte aber eine alternative Verwendung anbieten
list.extend()
.Das ist etwas schneller als das doppelte Listenverständnis.
Python-Version: 3.8.0
quelle