Понимание списка Python - просто - PullRequest
7 голосов
/ 01 октября 2011

У меня есть список, и я хочу использовать определенную функцию только для тех записей, которые удовлетворяют определенному условию - оставляя другие записи без изменений.

Пример: скажем, я хочу умножить на 2 только те элементы, которые являются четными.

a_list = [1, 2, 3, 4, 5]

Требуется результат:

a_list => [1, 4, 3, 8, 5]

Но [elem * 2 for elem in a_list if elem %2 == 0] дает [4, 8] (он также работал как фильтр).

Как правильно это сделать?

Ответы [ 3 ]

18 голосов
/ 01 октября 2011

Используйте условное выражение :

[x * 2 if x % 2 == 0 else x
 for x in a_list]

(Примечание математика: этот конкретный случай также можно решить с помощью

[x * (2 - x % 2) for x in a_list]

, но я бы предпочелпервый вариант все равно;)

2 голосов
/ 01 октября 2011
a_list = [1, 2, 3, 4, 5]

print [elem*2 if elem%2==0 else elem  for elem in a_list ]  

или, если у вас есть очень длинный список, который вы хотите изменить на месте:

a_list = [1, 2, 3, 4, 5]

for i,elem in enumerate(a_list):
    if elem%2==0:
        a_list[i] = elem*2

, поэтому изменяются только четные элементы

0 голосов
/ 01 октября 2011

Вы можете использовать лямбду:

>>> a_list = [1, 2, 3, 4, 5]
>>> f = lambda x: x%2 and x or x*2
>>> a_list = [f(i) for i in a_list]
>>> a_list
[1, 4, 3, 8, 5]

Редактировать - Размышляя о замечании agf , я сделал 2-ю версию своего кода:

>>> a_list = [1, 2, 3, 4, 5]
>>> f = lambda x: x if x%2 else x*2
>>> a_list = [f(i) for i in a_list]
>>> a_list
[1, 4, 3, 8, 5]
...