将列表本身扩展 N 次的最佳方法

Best way to extend a list with itself N times

所以我有一个列表[a,b,c],我想获得[a,b,c,a,b,c,...a,b,c]

我当然可以用两个嵌套循环来做到这一点,但一定有更好的方法吗?如果我能提供一个计数,itertools.cycle() 本来就是解决方案。

两个约束:

  1. 它应该在 2.7 中工作(但出于好奇,我对 3.x 解决方案感兴趣)
  2. 列表元素应该是独立的副本(它们是可变类型)

对于不可变类型,可以使用列表中的乘法运算符:

>>> [1,2,3]*5
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

对于可变类型,您需要在插入之前执行元素的复制。

我会链接列表项的重复副本。

import copy,itertools

a=[12]
b=[13]
c=[14]

l = [a,b,c]

new_l = list(itertools.chain.from_iterable(map(copy.copy,l) for _ in range(5)))

new_l中,所有列表都是独立的(引用不是彼此的副本)。在某些情况下,您可能需要 copy.deepcopy

复杂度可以用列表乘法,很快:

s = ['a', 'b', 'c'] * i

然后你可以通过索引修改元素,你不觉得很净吗?

最后我想出了:

[copy.copy(e) for _ in range(N) for e in sourceList]

首先,如果有 list = [a, b, c],如果打印它,就会出现以下错误

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-17-eb02c90df247> in <module>
----> 1 list = [a, b, c]
      2 list

NameError: name 'c' is not defined

list应该定义如下

>>> list = ['a', 'b', 'c']
>>> print(list)
['a', 'b', 'c']

对于您的情况,只需将列表乘以 N 即可。对于示例,让我们考虑 N=3

>>> n = 3
>>> list = list*n
['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']

现在,如果需要扩展列表(考虑,例如,N=3)如下,并根据需要给出替代答案

['a' 'a' 'a' 'b' 'b' 'b' 'c' 'c' 'c']

可以使用 np.repeat 做到这一点

>>> n = 3
>>> list= np.repeat(list, n)
array(['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], dtype='<U1')

这检索了一个数组。如果那不符合自己的需要并且想要一个列表(使用np.ndarray.tolist),如下

>>> list = list.tolist()
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']