Python 元素出现两次的列表理解

Python 元素出现两次的列表理解,python,list,list-comprehension,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 = ['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']
,我希望相同的元素相邻。

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

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

您可以
zip
对照列表本身,然后在列表中将其展平

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

您可以使用
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']
更一般的:

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

链接到源代码:

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

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

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

来自itertools导入链的
,三通
l=['a','c','b']
n=2
列表(链从可伸缩(zip(*T(l,n)))
虽然这可能不如其他答案执行得快,但它可以通过省略
list()
轻松地用于任意iterables(特别是当它们是内联的或您不知道它们何时结束时)


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

选择此选项,因为它看起来更优雅。请注意,与@Yousaf给出的答案相比,
最慢的运行时间比最快的运行时间长5.32倍,执行此操作的计时将产生1000000个循环,每个循环的最佳时间为3:1.49µs。这可能意味着正在缓存中间结果。1000000个循环,最好是3:1.12µs/循环
我认为使用更长的列表进行计时。三个要素是如此之短,以至于时间并不重要。对于上面的代码,我还得到了“最慢的运行时间比最快的运行时间长5.41倍”。
sorted(l*2, key=l.index)
#['a', 'a', 'c', 'c', 'b', 'b']