假设我有清单
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']
提供帮助,我希望相邻的元素相邻。
答案 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)]
答案 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时或当你不知道它们何时结束时)。
(注意,通过用生成器表达式替换它们的列表理解,一些其他答案也可以适用于任意迭代。)