使用列表推导重复列表项

时间:2014-09-27 11:30:55

标签: python

我想将列表中的项目复制到新列表中,例如

a=[1,2]
b=[[i,i] for i in a]

给出[[1, 1], [2, 2]],而我希望[1, 1, 2, 2]

我还发现我可以使用:

b=[i for i in a for j in a]

但是使用两个for循环似乎有些过分。是否可以使用单个for循环执行此操作?

4 个答案:

答案 0 :(得分:2)

你想要itertools.chain.from_iterable(),它接受​​一个可迭代的迭代,并返回一个带有子迭代的所有元素的迭代(展平一个级别):

b = itertools.chain.from_iterable((i, i) for i in a)

结合生成器表达式,您可以获得所需的结果。显然,如果你需要一个列表,只需在迭代器上调用list(),但在大多数情况下不需要(并且效率较低)。

如果像Ashwini建议的那样,你想要每个项len(a)次,那么这样做也很简单:

duplicates = len(a)
b = itertools.chain.from_iterable([i] * duplicates for i in a)

请注意,这些解决方案中的任何一个都不会复制i,它们会为您提供对同一元素的多个引用。大多数时候,这应该没问题。

答案 1 :(得分:1)

你的双循环代码实际上并没有你想要的,因为内循环是针对外循环的每一步进行评估的。这是一个简单的解决方案:

b = [j for i in a for j in (i, i)]

答案 2 :(得分:1)

您可以使用xrange并使用生成器表达式或列表推导

b = (x for x in a for _ in xrange(2))

b = [x for x in a for _ in xrange(2)]

答案 3 :(得分:0)

如果您不介意订单:

>>> a = [1,2]
>>> a * 2

[1, 2, 1, 2]