我有一个包含以下内容的列表:
[1,2,3,4,0,9,8,7,6]
,我想基于列表中的“ 0”指示符反转列表中的值。因此,对于“ 0”之前的元素,我希望它们可以颠倒。然后紧跟着'0'之后的元素将使我:
[4,3,2,1,0,6,7,8,9]
我尝试使用list [::-1],但是如果我要基于该指标对其进行调节,它将无法正常工作。希望对此有所帮助。
答案 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]