2016-04-05 2 views
4

Я работаю над некоторыми учебными упражнениями, изучая понимание python. Я натолкнулся на тот, который просит построить понимание, которое возвращает 3-кортеж всех комбинаций чисел в заданном наборе, которые суммируются до нуля - исключая тривиальный пример (0,0,0).фильтрация списков python-фильтров

Я пришел с этим:

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

есть более краткий способ, чтобы написать это? похоже, должен быть лучший способ проверить, равна ли x, y, z сумме нулю.

ответ

4

Если важен порядок вы можете использовать itertools.permutation():

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

В противном случае используйте itertools.combinations()

+0

'[... if sum (sub) == 0 и sub! = (0, 0, 0)]'? Вам не нужно исключать «тривиальный пример (0,0,0)»? – Alexander

+0

@ Александр Да, конечно. – Kasramvd

0

После «Дзэн Python», я бы просто сделать простое изменение в условия фильтра:

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

Ну, вам нужны все комбинации не p ermutations, как вам нужно, sum им.

import itertools 
cs = itertools.combinations(sequence, 3) 
result = [c for c in cs if sum(c) == 0 and any(c)] 
Смежные вопросы