2009-11-12 2 views
2
M = [[1,2,3], 
    [4,5,6], 
    [7,8,9]] 

col2 = [row[1] + 1 for row in M if row[1] % 2 == 0] 
print (col2) 

Выход: [3, 9]Фильтрующие нечетные числа

Я ожидал, что это отфильтровать нечетные числа, но это делает противоположное.

+0

Помогло бы, если бы вы отправили свой предполагаемый результат в будущем –

ответ

6

Код делает именно то, что вы ожидаете - если второй элемент четный, увеличьте его на единицу и поместите в список.

Итак, для первой строки он видит, что 2% 2 == 0 является True и устанавливает col2 [0] = 2 + 1 = 3. Для второй строки 5% 2 == 0 является False. Для третьего ряда, 8% 2 == 0 истинно, и col2 [1] = 8 + 1 = 9.

+0

О, поэтому он сначала считывает инструкцию IF? Я думал, что заявления обрабатываются влево-вправо? – 3zzy

+1

Да - перечисление списков допускает множественные условия после цикла for, а выражение слева оценивается после рассмотрения всех этих условий. (техническое объяснение: http://docs.python.org/reference/expressions.html#list-displays) –

0

Вы тестируете row[1]%2, но печать row[1]+1
так, когда row[1]==2, это даже, но вы является добавление 3 к результату
когда row[1]==5, это странно, так что вы отфильтровать его
и когда row[1]==8, это даже, но вы добавление 9 в результате

2

Я считаю, что вам нужно переключить сравнение до == 1 от == 0.

Модуль любого числа, деленный на 2, равен 0 или 1, 1, когда он нечетный.

+0

Хм..не действительно. Я пробовал это: для n в диапазоне (10): n = n% 2 и печатал ODD как '0' – 3zzy

0
M = [[1,2,3], 
    [4,5,6], 
    [7,8,9]] 
col2 = [] 

for row in M: 
    if row[1]%2 == 1: 
     col2.append(row[1]) 
print col2 
Смежные вопросы