2016-01-16 6 views
13

Ich versuche, die Liste der Drei-Element-Tupel aus der Liste [-4, -2, 1, 2, 5, 0] mit Hilfe von Comprehensions zu erhalten und zu überprüfen, ob sie die Bedingung sum([] == 0) erfüllen. Der folgende Code funktioniert. Allerdings gibt es keine Frage, dass es sollte eine einfacher, viel elegante Art und Weise auszudrücken, diese Comprehensions sein:Verständnis in Python zum Tupeln von Tupeln aus einer Liste

[ 
    (i, j, k) for i in [-4, -2, 1, 2, 5, 0] 
       for j in [-4, -2, 1, 2, 5, 0] 
       for k in [-4, -2, 1, 2, 5, 0] if sum([i, j, k]) == 0 
] 

Ausgang:

[(-4, 2, 2), (-2, 1, 1), (-2, 2, 0), (-2, 0, 2), (1, -2, 1), 
(1, 1, -2), (2, -4, 2), (2, -2, 0), (2, 2, -4), (2, 0, -2), 
(0, -2, 2), (0, 2, -2), (0, 0, 0)] 

Die Frage ist auf der Suche wie (i, j, k) for i, j, k in [-4, -2, 1, 2, 5, 0] für einen Ausdruck.

+0

repeted Ist-Werte erlaubt? – Arman

Antwort

19

Sie können itertools.product verwenden, um die verschachtelten Schleifen in Ihrem Listenverständnis zu verbergen. Verwenden Sie die repeat Parameter die Anzahl von Schleifen über die Liste (das heißt die Anzahl der Elemente in dem Tupel) zu setzen:

>>> import itertools 
>>> lst = [-4, -2, 1, 2, 5, 0] 
>>> [x for x in itertools.product(lst, repeat=3) if sum(x) == 0] 
[(-4, 2, 2), 
(-2, 1, 1), 
(-2, 2, 0), 
(-2, 0, 2), 
(1, -2, 1), 
(1, 1, -2), 
(2, -4, 2), 
(2, -2, 0), 
(2, 2, -4), 
(2, 0, -2), 
(0, -2, 2), 
(0, 2, -2), 
(0, 0, 0)]