list comprehension:为输入列表中的每个项创建2个项目?

时间:2016-12-30 00:10:45

标签: python list-comprehension

我有一个如下列表:

list1 = ["pierre", "paul", "jacques"]

我想创建一个包含6个项目的新列表:

list2 = ["pierre", "pierre#2","paul","paul#2", "jacques", "jacques#2"] 

我尝试了以下内容:

list2 = [i, "{}#2".format(i) for i in list1 ]

显然没有用。有人会建议什么会起作用吗?

4 个答案:

答案 0 :(得分:6)

您可以使用嵌套循环执行此操作:

[item for i in list1 for item in (i, "{}#2".format(i))]

for item in (...)内循环每次产生2个项目。

答案 1 :(得分:2)

也许我是唯一一个难以阅读嵌套列表推导的人,但我倾向于像瘟疫 1 那样避开它们。在这种情况下,我可能会使用香草循环:

lst_out = []
for item in list1:
    lst_out.extend((item, '{}#2'.format(item)))

或另一种选择是生成器功能:

def gen(list1):
    for item in list1:
        yield item
        yield '{}#2'.format(item)

1 这不是100%真实......标准的嵌套列表展平成语对我来说是公认的,所以我已经使用过一次或两次。也许我只需要开始使用它们,以便它们变得更直观......

答案 2 :(得分:0)

你永远不会这样做(其他答案都更好),但作为思考练习:

from itertools import chain
l = list(chain.from_iterable((x, x+'#2') for x in list1))

答案 3 :(得分:0)

你仍然可以尝试(你只是缺少一些括号来创建tuple s)然后"展平"后来的元组:

list2 = [(i, "{}#2".format(i)) for i in list1]
list2 = [x for y in list2 for x in y]

产生:

['pierre', 'pierre#2', 'paul', 'paul#2', 'jacques', 'jacques#2']
相关问题