我想将列表中的项目复制到新列表中,例如
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
循环执行此操作?
答案 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]