Python 使用列表理解复制列表项

Python 使用列表理解复制列表项,python,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循环执行此操作 您想要的,它接受一个iterable的iterable并返回一个iterable,其中包含子iterable的所有元素(展平一级): 结合生成器表达式,可以得到所需的结果。显然,如果需要列表

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

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
循环执行此操作

您想要的,它接受一个iterable的iterable并返回一个iterable,其中包含子iterable的所有元素(展平一级):

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

正如Ashwini所建议的,如果您希望每个项目
len(a)
重复,那么也很简单:

duplicates = len(a)
b = itertools.chain.from_iterable([i] * duplicates for i in a)
请注意,这些解决方案中的任何一个都不会复制
i
,它们为您提供了对同一元素的多个引用。大多数情况下,这应该没问题。

您需要,它获取一个iterable,并返回一个iterable,其中包含子iterable的所有元素(展平一级):

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

正如Ashwini所建议的,如果您希望每个项目
len(a)
重复,那么也很简单:

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

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

如果您不介意点餐:

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

[1, 2, 1, 2]

如果您不介意点菜:

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

[1, 2, 1, 2]

您的两个循环代码实际上并没有实现您想要的功能,因为内部循环是为外部循环的每个步骤计算的。以下是一个简单的解决方案:

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

您的两个循环代码实际上并没有实现您想要的功能,因为内部循环是为外部循环的每个步骤计算的。以下是一个简单的解决方案:

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

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

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

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

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

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

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

是否要将每个项目重复2次或
len(a)
次?请注意,这些不仅仅是
循环的
,而是循环的
。了解它们如何工作的机制是值得的,尤其是因为有许多兄弟结构(生成器表达式、集合理解等)具有不同的行为。@AshwiniChaudhary我想将每个项目重复两次,因此
[1,2,3]
将变成
[1,1,2,2,3,3]
@HåkonHægland那么你的基于列表理解的代码实际上是错误的。@AshwiniChaudhary谢谢,我现在意识到了。你想把每个项目重复2次还是
len(a)
次?请注意,这些不仅仅是
循环的
,它们是。了解它们如何工作的机制是值得的,尤其是因为有许多兄弟结构(生成器表达式、集合理解等)具有不同的行为。@AshwiniChaudhary我想将每个项目重复两次,因此
[1,2,3]
将变成
[1,1,2,2,3,3]
@HåkonHægland那么你的列表理解代码实际上是错误的。@AshwiniChaudhary谢谢,我现在意识到了。答案怎么了?不要像OP所要求的那样重复列表中的项目?这绝对不值得投反对票-这可能不适合OP的情况,但这是一个潜在的解决方案。OP从来没有说过一定要下订单,而你的回答指出,订单不会像给定的那样。这是一个很好的答案,如果有人不在乎的话——如果有人问这个问题,很可能就是这样。这个答案有什么问题?不要像OP所要求的那样重复列表中的项目?这绝对不值得投反对票-这可能不适合OP的情况,但这是一个潜在的解决方案。OP从来没有说过一定要下订单,而你的回答指出,订单不会像给定的那样。这是一个很好的答案,如果有人不在乎的话——如果有人问这个问题,很可能就是这样。