用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]