将列表本身扩展 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()
本来就是解决方案。
两个约束:
- 它应该在 2.7 中工作(但出于好奇,我对 3.x 解决方案感兴趣)
- 列表元素应该是独立的副本(它们是可变类型)
对于不可变类型,可以使用列表中的乘法运算符:
>>> [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']
所以我有一个列表[a,b,c]
,我想获得[a,b,c,a,b,c,...a,b,c]
。
我当然可以用两个嵌套循环来做到这一点,但一定有更好的方法吗?如果我能提供一个计数,itertools.cycle()
本来就是解决方案。
两个约束:
- 它应该在 2.7 中工作(但出于好奇,我对 3.x 解决方案感兴趣)
- 列表元素应该是独立的副本(它们是可变类型)
对于不可变类型,可以使用列表中的乘法运算符:
>>> [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']