复制列表中的每个成员

问题描述 投票:33回答:9

我想编写一个可以恢复列表的功能[1,5,3,6,...]并给出[1,1,5,5,3,3,6,6,...]。知道怎么做吗?

python list
9个回答
54
投票
>>> 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]

N.B。传统上,_用作占位符变量名称,在此您不希望对变量的内容做任何事情。在这种情况下,它仅用于在外部循环中每次生成两个值。

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


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]

10
投票

[如果您已经有了roundrobin文档中描述的itertools配方,并且非常方便,那么您就可以使用

itertools

9
投票

我将使用roundrobin(my_list, my_list) zip

itertools.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调用...


5
投票

list做您想做的事情:

numpy.repeat

结果:

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

如果您不介意使用numpy数组,也可以在最后一行省略[1, 1, 5, 5, 3, 3, 6, 6] 调用。


2
投票

我会用

list()

import itertools foo = [1, 5, 3, 6] new = itertools.chain.from_iterable([item, item] for item in foo) 将是一个对重复项进行延迟迭代的迭代器。如果需要计算实际列表,则可以执行new或使用其他解决方案之一。


1
投票

[尽管Guido不喜欢函数运算符,他们可能非常方便:

list(new)

0
投票

稍加切片...

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

-1
投票

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

>>> a = [3, 1, 4, 1, 5]
>>> a[:0] = a[::2] = a[1::2] = a[:]
>>> a
[3, 3, 1, 1, 4, 4, 1, 1, 5, 5]
© www.soinside.com 2019 - 2024. All rights reserved.