2016-04-05 34 views
4

Python anlamalarını öğrenen bazı öğretici alıştırmalar üzerinde çalışıyorum. Ben (0,0,0) önemsiz örnek hariç - sıfıra toplanan verilen bir sette tüm sayı kombinasyonlarının 3-tuple döndüren bir anlama inşa etmek istedim.filtreleme python listesi anlaşmaları

Ben bu geldi:

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])` 

bunu yazmak için daha kısa bir yol var? x, y, z toplamının sıfır olup olmadığını kontrol etmenin daha iyi bir yolu olmalı gibi görünüyor. sırası önemli değilse

cevap

4

sen itertools.permutation() kullanabilirsiniz:

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

Yada "Python Zen" ardından itertools.combinations()

+0

'[... eğer toplam (alt) == 0 ve alt! = (0, 0, 0)]'? "(0,0,0) 'un önemsiz örneğini hariç tutmanız gerekmiyor mu? – Alexander

+0

@Alexander Evet, tabi. – Kasramvd

0

kullanmak, sadece filtre durumuna basit bir değişiklik yapacak:

[(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

kombinasyonlarıp'ye ihtiyacınız var. adresinden sum'a gereksiniminiz olduğu gibi.