Заменить значения в списке с помощью Python

У меня есть список, где я хочу заменить значения None, где condition() возвращает True.

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Например, если условие проверки bool (item% 2) должно возвращаться:

[None, 1, None, 3, None, 5, None, 7, None, 9, None]

Каков наиболее эффективный способ сделать это?

Ответ 1

Самый эффективный:

items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for index, item in enumerate(items):
    if not (item % 2):
        items[index] = None

Проще всего читать:

new_items = [x if x % 2 else None for x in items]

Ответ 2

ls = [x if (condition) else None for x in ls]

Ответ 3

Повторение на стороне вопроса, заданного OP в комментарии, то есть:

что, если бы у меня был генератор, который дает значения из диапазона (11) вместо список. Можно ли заменить значения в генераторе?

Конечно, это тривиально легко...:

def replaceiniter(it, predicate, replacement=None):
  for item in it:
    if predicate(item): yield replacement
    else: yield item

Просто передайте любой итерабельный (в том числе результат вызова генератора) в качестве первого аргумента arg, предикат, чтобы решить, нужно ли заменить значение в качестве второго аргумента, и пусть 'er rip.

Например:

>>> list(replaceiniter(xrange(11), lambda x: x%2))
[0, None, 2, None, 4, None, 6, None, 8, None, 10]

Ответ 4

Здесь другой способ:

>>> L = range (11)
>>> map(lambda x: x if x%2 else None, L)
[None, 1, None, 3, None, 5, None, 7, None, 9, None]

Ответ 5

>>> L = range (11)
>>> [ x if x%2 == 1 else None for x in L ]
[None, 1, None, 3, None, 5, None, 7, None, 9, None]

Ответ 6

Это может помочь...

test_list = [5, 8]
test_list[0] = None
print test_list
#prints [None, 8]