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]
Фильтрующие нечетные числа
Я ожидал, что это отфильтровать нечетные числа, но это делает противоположное.
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]
Фильтрующие нечетные числа
Я ожидал, что это отфильтровать нечетные числа, но это делает противоположное.
Код делает именно то, что вы ожидаете - если второй элемент четный, увеличьте его на единицу и поместите в список.
Итак, для первой строки он видит, что 2% 2 == 0 является True и устанавливает col2 [0] = 2 + 1 = 3. Для второй строки 5% 2 == 0 является False. Для третьего ряда, 8% 2 == 0 истинно, и col2 [1] = 8 + 1 = 9.
О, поэтому он сначала считывает инструкцию IF? Я думал, что заявления обрабатываются влево-вправо? – 3zzy
Да - перечисление списков допускает множественные условия после цикла for, а выражение слева оценивается после рассмотрения всех этих условий. (техническое объяснение: http://docs.python.org/reference/expressions.html#list-displays) –
Вы тестируете row[1]%2
, но печать row[1]+1
так, когда row[1]==2
, это даже, но вы является добавление 3
к результату
когда row[1]==5
, это странно, так что вы отфильтровать его
и когда row[1]==8
, это даже, но вы добавление 9
в результате
Я считаю, что вам нужно переключить сравнение до == 1
от == 0
.
Модуль любого числа, деленный на 2, равен 0 или 1, 1, когда он нечетный.
Хм..не действительно. Я пробовал это: для n в диапазоне (10): n = n% 2 и печатал ODD как '0' – 3zzy
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
Помогло бы, если бы вы отправили свой предполагаемый результат в будущем –