代码之家  ›  专栏  ›  技术社区  ›  Maxxx

按指标反转元素列表

  •  1
  • Maxxx  · 技术社区  · 8 年前

    我有一份清单,包括:

    [1,2,3,4,0,9,8,7,6]
    

    我想根据列表中的指标“0”反转列表中的值。因此,对于“0”之前的元素,我希望它们被反转。“0”后面的元素将得到:

    [4,3,2,1,0,6,7,8,9]
    

    我试着使用list[::-1],但是如果我根据那个指示器来调整它,它就不起作用了。如果你能帮上忙我会很感激的。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Jean-François Fabre    8 年前

    只需按0的位置拆分,然后将两个零件反转,重新组装:

    lst = [1,2,3,4,0,9,8,7,6]
    zidx = lst.index(0)
    result = lst[zidx-1::-1] + [0] + lst[:zidx:-1]
    

    结果:

    [4, 3, 2, 1, 0, 6, 7, 8, 9]
    

    (使用反向+切片时,切片的微调需要一些时间,但可以避免创建太多临时列表)

        2
  •  3
  •   Jean-François Fabre    7 年前

    groupby 将列表分组为非零和零,然后反转这些组中的每一个,然后再次将它们连接在一起。

    import itertools
    
    def flip(seq):
        return [x for k,v in itertools.groupby(seq, key=bool) for x in reversed(list(v))]
    
    test_cases = (
        [1,2,3,4,0,9,8,7,6],
        [1,2,0,3,4,0,5,6,0],
        [1,2,3]
    )
    
    for seq in test_cases:
        print("{} flips into {}".format(seq, flip(seq)))
    

    与基于索引和切片的解决方案相比,它的一个潜在优势是,它可以对具有多个零或根本没有零的输入进行操作。

    结果:

    [1, 2, 3, 4, 0, 9, 8, 7, 6] flips into [4, 3, 2, 1, 0, 6, 7, 8, 9]
    [1, 2, 0, 3, 4, 0, 5, 6, 0] flips into [2, 1, 0, 4, 3, 0, 6, 5, 0]
    [1, 2, 3] flips into [3, 2, 1]
    
    推荐文章