以给定的合并顺序合并两个或多个列表

发布于 2021-01-29 17:29:30

在开始时,我有2个列表和1个列表,这些列表表示应该按什么顺序合并这两个列表。例如,我的第一个列表等于[a, b, c]和第二个列表等于[d, e]和“合并”列表等于[0, 1, 0, 0, 1]

这意味着:首先要生成合并列表,我需要从第一个列表中获取元素,然后从第二个列表中获取元素,然后从第一个列表中获取元素,然后从第一个列表中获取元素,然后从第二个列表中获取元素[a, d, b, c, e]。为了解决这个问题,我只使用了循环和两个“指针”,但是我想知道是否可以用pythonic做更多的工作……我试图找到一些可以帮助我的函数,但没有实际结果。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以从这些列表创建迭代器,遍历排序列表,然后调用next其中一个迭代器:

    i1 = iter(['a', 'b', 'c'])
    i2 = iter(['d', 'e'])
    # Select the iterator to advance: `i2` if `x` == 1, `i1` otherwise
    print([next(i2 if x else i1) for x in [0, 1, 0, 0, 1]]) # ['a', 'd', 'b', 'c', 'e']
    

    可以将此解决方案推广到任意数量的列表,如下所示

    def ordered_merge(lists, selector):
        its = [iter(l) for l in lists]
        for i in selector:
            yield next(its[i])
    
    
    
    In [4]: list(ordered_merge([[3, 4], [1, 5], [2, 6]], [1, 2, 0, 0, 1, 2]))
    Out[4]: [1, 2, 3, 4, 5, 6]
    

    如果排序列表包含字符串,浮点数或任何其他不能用作列表索引的对象,请使用字典:

    def ordered_merge(mapping, selector):
        its = {k: iter(v) for k, v in mapping.items()}
        for i in selector:
            yield next(its[i])
    
    
    
    In [6]: mapping = {'A': [3, 4], 'B': [1, 5], 'C': [2, 6]}
    
    In [7]: list(ordered_merge(mapping, ['B', 'C', 'A', 'A', 'B', 'C']))
    Out[7]: [1, 2, 3, 4, 5, 6]
    

    当然,您也可以使用整数作为字典键。


    或者,您可以从每个原始列表的左侧一一删除元素,然后将它们添加到结果列表中。快速示例:

    In [8]: A = ['a', 'b', 'c']
       ...: B = ['d', 'e']
       ...: selector = [0, 1, 0, 0, 1]
       ...:
    
    In [9]: [B.pop(0) if x else A.pop(0) for x in selector]
    Out[9]: ['a', 'd', 'b', 'c', 'e']
    

    我希望第一种方法更有效(list.pop(0) )。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看