2016-04-05 3 views
4

Ich arbeite durch einige Tutorial-Übungen lernen über Python-Verständnis. Ich bin auf einen gestoßen, der ein Verständnis aufstellen möchte, das ein 3-Tupel aller Zahlenkombinationen in einer gegebenen Menge zurückgibt, die auf Null summieren - ohne das triviale Beispiel von (0,0,0).Filtern von Python-Liste Comprehensions

kam ich mit auf den Punkt:

def tupleNonTrivialSumation(s): 
    '''return a 3-tuple of x,y,z : x+y+z=0 & the list does not contain (0,0,0)''' 
    return tuple([(x,y,z) for x in s for y in s for z in s if x+y+z==0 if abs(x)+abs(y)+abs(z)!=0])` 

ist es eine prägnante Art und Weise, dies zu schreiben? es scheint, als ob es einen besseren Weg geben sollte zu überprüfen, ob x, y, z zu Null summieren.

Antwort

4

Wenn die Reihenfolge wichtig ist, können Sie itertools.permutation() verwenden:

from itertools import permutation 
[sub for sub in permutation(s, 3) if sum(sub) == 0 and sub != (0, 0, 0)] 

Ansonsten itertools.combinations()

+0

'[... wenn Summe (sub) == 0 und sub! = (0, 0, 0)]'? Müssen Sie "das triviale Beispiel von (0,0,0)" nicht ausschließen? – Alexander

+0

@Alexander Ja, sicher. – Kasramvd

0

Im Anschluss an der "Zen of Python" verwenden, würde ich nur einen einfachen Änderungszustand an den Filter machen:

[(x, y, z) for x in s for y in s for z in s if x + y + z == 0 and (x, y, z) != (0, 0, 0)] 
0

Nun, müssen Sie alle Kombinationen nicht p Ermmutungen wie Sie sum sie benötigen.

import itertools 
cs = itertools.combinations(sequence, 3) 
result = [c for c in cs if sum(c) == 0 and any(c)]