用Pythonreplace列表中的值

我有一个列表,我想用Nonereplace值,其中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] 

什么是最有效的方式来做到这一点?

最有效率的:

 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] 
 ls = [x if (condition) else None for x in ls] 

对于OP在评论中提出的侧面问题,

如果我有一个生成器生成范围(11)而不是列表中的值,那该怎么办呢? 是否有可能取代发生器中的值?

当然,这很容易…:

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

只要传递任何可迭代(包括调用一个生成器的结果)作为第一个参数,谓词决定一个值是否必须replace为第二参数,让呃裂口。

例如:

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

这是另一种方式:

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

这可能有帮助…

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