2013-07-10 3 views
3

Я искал все, но не смог вывести эту штуку.Понимание списка возвращает неправильный результат

Я из фона Java, если это помогает, пытаясь изучить python.

a = [ 
    (i,j,k) for (i,j,k) in [ 
     (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 (i+j+k > 0 & (i!=0 & j!=0 & k!=0)) 
     ] 
] 

Утверждение: получить все кортежи, чья сумма равна нулю, но ни один из них не должен иметь 0 в нем.

Всегда, этот результат состоит из всех кортежей. ... :(

+2

В чем причина внешнего понимания? На самом деле это не делает ничего полезного, но у вас должна быть причина для его написания. – user2357112

+0

Правда, в первый раз я пробовал без него .. Но это все еще не сработало. Поэтому я видел, работает ли с ним. – abhididdigi

ответ

9

Вы используете неправильный оператор Вы хотите boolean and; & is a bitwise operator:

[(i,j,k) for (i,j,k) in [(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 (i+j+k > 0 and (i!=0 and j!=0 and k!=0)) ] ] 

Вы можете устранить это вложенный список понимание, он является излишним:

[(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 (i+j+k > 0 and (i!=0 and j!=0 and k!=0))] 

Далее используйте itertools.product() function к г enerate все комбинации вместо вложенных циклов, и all(), чтобы проверить, если все значения не равны нулю:

from itertools import product 
[t for t in product({-4,-2,1,2,5,0}, repeat=3) if sum(t) > 0 and all(t)] 

, но вы можете также опустить 0 из набора и спасти себя all() тест:

from itertools import product 
[t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) > 0] 

и, возможно, вы хотите, чтобы исправить этот тест на равен к 0:

from itertools import product 
[t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) == 0] 

Результат:

>>> [t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) == 0] 
[(1, 1, -2), (1, -2, 1), (2, 2, -4), (2, -4, 2), (-4, 2, 2), (-2, 1, 1)] 
+0

Спасибо, я попытался использовать &&, но теперь я знаю, что должен был использовать и – abhididdigi

9

В питоне, & немного оператора для вашей потребности, вы должны использовать and

+0

Кроме того, здесь существует большая проблема. – glglgl

1

Другие ребята обращаются к неправильной проблеме. Да, and является логическим, а & побитовым, но поскольку операнды являются логическими, это фактически не влияет на ваш код. Упс; что на самом деле влияет на ваш код, поскольку приоритет отличается. Кроме того, хотя, у вас есть опечатка:

i+j+k > 0 

должен быть

i + j + k == 0 

если вы хотите кортежи, сумма которых равна 0.

+0

Да, спасибо за вашу помощь. Изменен. Мой вопрос был фактически вокруг операторов. – abhididdigi

1

Используя itertools.product и сумму():

from itertools import product 

list1 = (-4,-2,1,2,5,0) 
list2 = (-4,-2,1,2,5,0) 

print [ couple for couple in product(list1, list2) if not sum(couple) ] 
+0

Не был достаточно быстрым, может использовать повтор аргумент itertools.product как показано @Martijn – geertjanvdk

3

Как уже говорилось, вы используете неправильный оператор.

Это не проблема как таковая, поскольку вы комбинируете (или, скорее, пытаетесь объединить) логические значения.

Но & и оператор and имеют разные precedence.

(i+j+k > 0 and (i!=0 and j!=0 and k!=0)) 

были бы правы, поскольку and имеет более высокий приоритет, чем > и !=.

Однако

(i+j+k > 0 & (i!=0 & j!=0 & k!=0)) 

оказывается

(i+j+k > (0 & (i != (0 & j) != (0 & k) !=0))) 

, что делает правую руку вычисляться 0, и выражение i + j + k > 0, кажется, верно для почти всех ваших данных.

+0

Спасибо вам за то, что нашли время, чтобы объяснить эту разницу. – abhididdigi