自己扩展列表N次的最佳方法

时间:2017-10-04 08:32:19

标签: python python-2.7

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

我当然可以用两个嵌套循环来做这个,但必须有更好的方法吗?如果我可以提供一个计数,那么itertools.cycle()就会成为解决方案。

两个限制因素:

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

4 个答案:

答案 0 :(得分:1)

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

>>> [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

答案 1 :(得分:1)

最终我提出了:

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

答案 2 :(得分:0)

你可以使用列表乘法作为复杂性,它非常快:

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

然后你可以按索引修改元素,你认为还不是吗?

答案 3 :(得分:0)

首先,如果有一个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']