复制列表中的每个成员 - python

问题描述 投票:26回答:8

我想写一个函数,恢复列表[1,5,3,6,...]并给[1,1,5,5,3,3,6,6,...]任何想法如何做到这一点?谢谢

python list
8个回答
50
投票
>>> a = range(10)
>>> [val for val in a for _ in (0, 1)]
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]

注: _传统上用作占位符变量名,您不希望对变量的内容执行任何操作。在这种情况下,它仅用于为外循环每次生成两个值。

要将其从列表转换为生成器,请使用圆括号替换方括号。


13
投票
>>> a = [1, 2, 3]
>>> b = []
>>> for i in a:
    b.extend([i, i])


>>> b
[1, 1, 2, 2, 3, 3]

要么

>>> [a[i//2] for i in range(len(a)*2)]
[1, 1, 2, 2, 3, 3]

9
投票

如果您已经有roundrobin文档中描述的itertools配方 - 它非常方便 - 那么您可以使用

roundrobin(my_list, my_list)

9
投票

我会用zipitertools.chain

>>> import itertools
>>> l = [1,5,3,6,16]
>>> list(itertools.chain(*zip(l,l)))
[1, 1, 5, 5, 3, 3, 6, 6, 16, 16]

注意:我只使用list消耗发生器使其适合打印。您可能不需要在代码中调用list ...


5
投票

numpy.repeat做你想要的:

import numpy as np
yourList = [1,5,3,6]
n = 2
list(np.repeat(yourList, n))

结果:

[1, 1, 5, 5, 3, 3, 6, 6]

如果你不介意使用numpy数组,你也可以在最后一行省略list()调用。


2
投票

我会用

import itertools
foo = [1, 5, 3, 6]
new = itertools.chain.from_iterable([item, item] for item in foo)

new将是一个懒惰迭代重复项的迭代器。如果您需要计算的实际列表,您可以执行list(new)或使用其他解决方案之一。


1
投票

因为Guido不喜欢功能操作符,所以它们非常方便:

>>> from operator import add
>>> a = range(10)
>>> b = reduce(add, [(x,x) for x in a])

0
投票

可以使用列表乘法。如果需要每个列表成员,只需使用排序方法。

>>> lst = [1,2,3,4]
>>> sorted(lst*2)
[1,1,2,2,3,3,4,4]
© www.soinside.com 2019 - 2024. All rights reserved.