混合两个列表的 Pythonic 方式

标签 python

<分区>

我有两个长度为 n 和 n+1 的列表:

[a_1, a_2, ..., a_n]
[b_1, b_2, ..., b_(n+1)]

我想要一个函数作为结果给出一个列表,其中包含两个交替元素,即

[b_1, a_1, ..., b_n, a_n, b_(n+1)]

以下是可行的,但看起来并不聪明:

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

任何人都可以建议一种更 pythonic 的方式来做到这一点吗?谢谢!

最佳答案

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

zip() 生成一个具有最短参数长度的迭代器。您可以将 a[-1] 附加到结果中,或者使用带有填充值的 itertools.zip_longest(对于 Python 2.x 为 izip_longest),然后删除该值。

并且您可以在此解决方案中使用两个以上的输入序列。

对于不附加最后一个值,你可以尝试这种肮脏的方法,但我并不真正推荐它,它不清楚:

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

(对于 Python 2.x,使用单个 /)

关于混合两个列表的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7529376/

相关文章:

python - Scrapy with selenium, webdriver 无法实例化

python - 如何在 python 中以长的、漂亮的圆角和本地化格式打印任何 float ,例如 1.234e22?

python - 前后端分离时的Django CSRF

python - 在 Pygame 中删除图像周围的边框

python - 通过识别重要变量来降维

python - 如何将多个循环合并为一个循环?

python 生成器 int() 的无效文字

python - 如何修复 ValueError : read of closed file exception?

Python线程,线程不关闭

python - 如何在保持顺序的同时在生成器上使用线程?