python:基于谓词重复列表中的元素

时间:2015-12-18 11:19:25

标签: python-2.7 list-comprehension itertools

我想基于谓词重复列表的元素。 我尝试使用模块itertools和列表理解

abc = [1,2,3,4,5,6,7,8,9]
result = [ repeat(item,2) if item==3 or item==7 else item for item in abc ]

这在运行时不会失败,但是生成的对象不会被压平' 如果我打印它,我会看到

[1, 2, repeat(3, 2), 4, 5, 6, repeat(7, 2), 8, 9]

列表理解是否可行?

由于

1 个答案:

答案 0 :(得分:1)

这有效:

from itertools import repeat
abc = [1,2,3,4,5,6,7,8,9]
result = [x for y in (repeat(item,2) if item==3 or item==7 else [item] for item in abc) 
          for x in y]

>>> result
[1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9]

这里的诀窍是将item放在自己的列表[item]中,然后展平现在一致的嵌套列表。

提高可读性,将其分为两行:

nested_items = (repeat(item,2) if item==3 or item==7 else [item] for item in abc)
result = [item for nested_item in nested_items for item in nested_item]

由于nested_items是一个迭代器,因此没有创建额外的列表。