我有两个长度为n和n + 1的列表:
[a_1, a_2, ..., a_n]
[b_1, b_2, ..., b_(n+1)]
Run Code Online (Sandbox Code Playgroud)
我想要一个函数给出一个列表,其中包含来自两者的备用元素,即
[b_1, a_1, ..., b_n, a_n, b_(n+1)]
Run Code Online (Sandbox Code Playgroud)
以下工作,但看起来不聪明:
def list_mixing(list_long,list_short):
list_res = []
for i in range(len(list_short)):
list_res.extend([list_long[i], list_short[i]])
list_res.append(list_long[-1])
return list_res
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议更多的pythonic方式吗?谢谢!
utd*_*mir 16
>>> import itertools
>>> a
['1', '2', '3', '4', '5', '6']
>>> b
['a', 'b', 'c', 'd', 'e', 'f']
>>> list(itertools.chain.from_iterable(zip(a,b)))
['1', 'a', '2', 'b', '3', 'c', '4', 'd', '5', 'e', '6', 'f']
Run Code Online (Sandbox Code Playgroud)
zip()生成一个具有最短参数长度的iterable.您可以附加a[-1]到结果,也可以使用itertools.zip_longest带有填充值的(izip_longest for Python 2.x)并在之后删除该值.
此解决方案可以使用两个以上的输入序列.
为了不附加最后一个值,你可以尝试这种肮脏的方法,但我不是真的推荐它,目前尚不清楚:
>>> a
[1, 2, 3, 4, 5]
>>> b
['a', 'b', 'c', 'd', 'e', 'f']
>>> [a[i//2] if i%2 else b[i//2] for i in range(len(a)*2+1)]
['a', 1, 'b', 2, 'c', 3, 'd', 4, 'e', 5, 'f']
Run Code Online (Sandbox Code Playgroud)
(对于Python 2.x,使用单个/)
Mik*_*nov 12
恕我直言最好的方法是:
result = [item for sublist in zip(a,b) for item in sublist]
Run Code Online (Sandbox Code Playgroud)
它也比总和更快,并减少方式.
UPD抱歉错过了你的第二个列表更大一个元素:)还有另一种疯狂的方式:
result = [item for sublist in map(None, a, b) for item in sublist][:-1]
Run Code Online (Sandbox Code Playgroud)