tes*_*060 13 python list-comprehension list
我有一个list
Python:
l = ['a', 'c', 'e', 'b']
Run Code Online (Sandbox Code Playgroud)
我想立即复制原件旁边的每个元素.
ll = ['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
Run Code Online (Sandbox Code Playgroud)
应保留元素的顺序.
Ste*_*ski 16
>>> l = ['a', 'c', 'e', 'b']
>>> [x for pair in zip(l,l) for x in pair]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
Run Code Online (Sandbox Code Playgroud)
要么
>>> from itertools import repeat
>>> [x for item in l for x in repeat(item, 2)]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
Run Code Online (Sandbox Code Playgroud)
oli*_*der 10
这是旧的,但我看不到这里的直截了当的选择(IMO):
[ item for item in l for repetitions in range(2) ]
Run Code Online (Sandbox Code Playgroud)
所以对于具体情况:
>>> l = ['a', 'c', 'e', 'b']
l = ['a', 'c', 'e', 'b']
>>> [ i for i in l for r in range(2) ]
[ i for i in l for r in range(2) ]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
>>>
Run Code Online (Sandbox Code Playgroud)
并概括:
[ item for item in l for _ in range(r) ]
Run Code Online (Sandbox Code Playgroud)
其中r是你想要的重复数量.
所以这有一个O(nr)空间和时间复杂度,很短,没有依赖性,也是惯用的.
import itertools
ll = list(itertools.chain.from_iterable((e, e) for e in l))
Run Code Online (Sandbox Code Playgroud)
工作中:
>>> import itertools
>>> l = ['a', 'c', 'e', 'b']
>>> ll = list(itertools.chain.from_iterable((e, e) for e in l))
>>> ll
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
Run Code Online (Sandbox Code Playgroud)
正如Lattyware指出的那样,如果您想要的不只是元素的两倍,那么:
from itertools import chain, repeat
ll = list(chain.from_iterable(repeat(e, 2) for e in l))
Run Code Online (Sandbox Code Playgroud)