2

执行以下操作的最pythonic方式是什么?它可以修改旧列表或创建新列表。

oldList = [1, 2, 3, 4]

newList = [1, 1, 2, 2, 3, 3, 4, 4]
4

6 回答 6

9

使用列表理解

>>> oldList = [1, 2, 3, 4]
>>> newList = [x for x in oldList for _ in range(2)]
>>> newList
[1, 1, 2, 2, 3, 3, 4, 4]

上面的列表理解类似于下面的嵌套 for 循环。

newList = []
for x in oldList:
    for _ in range(2):
        newList.append(x)
于 2013-11-12T05:36:50.580 回答
4

如果你真的很喜欢函数式编程:

from itertools import chain,izip
newList = list(chain(*izip(oldList,oldList)))

@falsetru 的答案更具可读性,因此可能符合“最蟒蛇”的试金石测试。

于 2013-11-12T05:59:36.460 回答
2

由于没有人做出修改 oldList 的答案。这是一个有趣的方式

>>> oldList = [1, 2, 3, 4]
>>> oldList += oldList
>>> oldList[::2] = oldList[1::2] = oldList[-4:]
>>> oldList
[1, 1, 2, 2, 3, 3, 4, 4]
于 2013-11-12T10:37:32.333 回答
1

使用函数概念的另外两种方法:

>>> list_ = [1,2,3,4]
>>> from itertools import chain
>>> list(chain(*[[x,x] for x in list_]))
[1, 1, 2, 2, 3, 3, 4, 4]
>>> reduce(lambda x,y: x+y, [[x,x] for x in list_])
[1, 1, 2, 2, 3, 3, 4, 4]

还有一个使用 numpy:

list(np.array([[x,x] for x in list_]).flatten())

最后一个作为列表理解:

[x for y in zip(list_, list_) for x in y]
于 2013-11-12T07:02:54.030 回答
1
>>> oldList = [1, 2, 3, 4]
>>> (4*(oldList+[0]+oldList))[::5]
[1, 1, 2, 2, 3, 3, 4, 4]

奇怪的是

$ python -m timeit -s  "oldList = [1, 2, 3, 4]" "[x for x in oldList for _ in range(2)]"
1000000 loops, best of 3: 1.65 usec per loop
$ python -m timeit -s  "oldList = [1, 2, 3, 4]" "(4*(oldList+[0]+oldList))[::5]"
1000000 loops, best of 3: 0.995 usec per loop
于 2013-11-12T10:40:28.147 回答
0
a=[1,2,3,4]
print a*2

这将打印 [1,2,3,4,1,2,3,4]

如果您想要重复的元素,可以使用这

如果您希望副本位于原件旁边,可以使用以下代码

a=[1,2,3,4]
b=[]
for i in range(0,len(a)):
    b.append(a[i])
    b.append(a[i])
print b

这将打印 b=[1,1,2,2,3,3,4,4]

于 2018-02-23T12:10:23.747 回答