Python-连续的角色消除



在python中,如果我有列表input = ['>','<',','>','<',',',','>','>'>','<','<']和i 不希望连续重复 elements >。例如,新列表将为 input = ['>','<',','>','<',','>','<'] 如何为其编写代码?

我已经尝试了

for i in input:
    if(i == i+1):
        delete(i+1)

但是此代码为列表中的整数值工作。

建议。

您很接近,但是您必须通过range迭代。工作示例:

input = ['>', '<', '>', '<', '>', '>', '<', '<']
indexes_to_delete = []
for i in range(len(input)-1):
    if(input[i] == input[i+1]):
        indexes_to_delete.append(i+1)
for idx in reversed(indexes_to_delete):
    input.pop(idx)
print(input)  # outputs ['>', '<', '>', '<', '>', '<']

i从0到input减去一个的长度,因为最后一个元素没有以下元素。indexes_to_delete存储索引以删除而不是直接删除它们,以避免通过input更改迭代。最后,如果按顺序弹出索引,则元素的位置将移动,因此要删除的下一个索引也必须移动;为了避免击打,请以相反的顺序弹出。

在您迭代时不要修改列表。最简单的做方法是将其复制到新列表中。

output = [input.pop(0)]
while input:
    temp = input.pop(0)
    if not temp == output[-1]:
        output.append(temp)

这可能不是最具性能的解决方案,但是您明白了。从列表中删除第一个元素,将其与您删除的最后一个元素(输出列表中的最后一个)进行比较,如果两个元素不同,则将其添加到输出列表中。重复直到您的原始列表为空。

您可以非常轻松,简洁地使用itertools.groupby

>>> data = ['>', '<', '>', '<', '>', '>', '<', '<']
>>> [x for x, _ in itertools.groupby(data)]
['>', '<', '>', '<', '>', '<']

该解决方案怎么样,它更简洁。

import copy
import itertools
l = ['>', '<', '>', '<', '>', '>', '<', '<']
z = copy.deepcopy(l)[1:]
[elem[0] for elem in itertools.izip_longest(l, z) if elem[0] != elem[1]]
['>', '<', '>', '<', '>', '<']

带有简单循环:

lst = ['>', '<', '>', '<', '>', '>', '<', '<']
result = [lst[0]]
for i in lst[1:]:
    if i != result[-1]:
        result.append(i)
print(result)

输出:

['>', '<', '>', '<', '>', '<']

最新更新