通过指标反转元素列表

时间:2018-09-10 15:59:03

标签: python list

我有一个包含以下内容的列表:

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

,我想基于列表中的“ 0”指示符反转列表中的值。因此,对于“ 0”之前的元素,我希望它们可以颠倒。然后紧跟着'0'之后的元素将使我:

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

我尝试使用list [::-1],但是如果我要基于该指标对其进行调节,它将无法正常工作。希望对此有所帮助。

2 个答案:

答案 0 :(得分:3)

仅根据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]

(切片的微调需要反向+切片,但是避免创建过多的临时列表)

答案 1 :(得分:3)

这是怎么回事:使用groupby将列表分为非零和零,然后反转每个组,然后将它们重新组合在一起。

import itertools

def flip(seq):
    return [x for k,v in itertools.groupby(seq, key=lambda x: x==0) 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]