列表理解与元素出现两次

时间:2017-01-20 12:00:02

标签: python list list-comprehension

假设我有清单

l = ['a', 'c', 'b']

我想要的是一个列表,其中这些元素一次又一次出现,所以

['a', 'a', 'c', 'c', 'b', 'b']

我希望以最可能的方式做到这一点。

我的半解决方案正在做类似

的事情
[[l[i], l[i]] for i in range(len(l))]

产生

[['a', 'a'], ['c', 'c'], ['b', 'b']]

从这里开始,我必须解析(遍历)列表以删除内部列表并获得单个平面列表。

任何人都有更好的想法一次性完成这项工作?显然l * 2之类的内容不会给['a', 'c', 'b', 'a', 'c', 'b']提供帮助,我希望相邻的元素相邻。

7 个答案:

答案 0 :(得分:4)

仅使用list comprehension,您可以执行以下操作:

[i for j in my_list for i in [j]*2]

<强>输出:

>>> my_list = ['a', 'c', 'b']
>>> [i for j in my_list for i in [j]*2]
['a', 'a', 'c', 'c', 'b', 'b']

答案 1 :(得分:4)

l_2 = [item for item in l for i in range(n)]

链接到原点:Stackoverflow: Repeating elements of a list n times

答案 2 :(得分:3)

你可以zip列表反对自己,然后在列表理解中将其展平。

>>> [i for j in zip(l,l) for i in j]
['a', 'a', 'c', 'c', 'b', 'b']

答案 3 :(得分:2)

您可以使用zip功能

l = ['a', 'c', 'b']
a = [i for j in zip(l,l) for i in j]
print(a)

输出

['a', 'a', 'c', 'c', 'b', 'b']

答案 4 :(得分:1)

更一般:

def ntimes(iterable, times=2):
    for elt in iterable:
        for _ in range(times):
            yield elt

答案 5 :(得分:1)

这是一个没有列表理解的简短解决方案,使用直观的想法l*2

sorted(l*2, key=l.index)
#['a', 'a', 'c', 'c', 'b', 'b']

答案 6 :(得分:1)

如果您喜欢功能性方法,可以这样做:

from itertools import chain, tee

l = ['a', 'c', 'b']
n = 2

list(chain.from_iterable(zip(*tee(l, n))))

虽然这可能没有其他答案那么快,但它可以通过省略list()轻松地用于任意迭代(特别是当它们在infite时或当你不知道它们何时结束时)。

(注意,通过用生成器表达式替换它们的列表理解,一些其他答案也可以适用于任意迭代。)