2017-09-19 26 views
0

在蟒如果我有列表输入= [ '>', '<', '>', '<', '>','>', '<',“ <']和我不希望连续重复列表中的元素。 例如,新列表将为input = ['>','<','>','<','>','<'] 我该如何编写代码?的Python - 连续字符消除

我已经尝试了

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

但这种代码工作列表中的整数值。

建议表示赞赏。

+0

使用['itertools.groupby'](https://docs.python.org/3/library/itertools.html#itertools.groupby) – donkopotamus

回答

0

您已经很近了,但是您必须遍历一个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更改迭代。最后,如果索引按顺序弹出,元素的位置会移动,因此下一个要删除的索引也必须移动;为了避免麻烦,以相反的顺序弹出。

0

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

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

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

0

您可以通过itertools.groupby轻松简单地做到这一点。

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

用简单的循环:

lst = ['>', '<', '>', '<', '>', '>', '<', '<'] 
result = [lst[0]] 

for i in lst[1:]: 
    if i != result[-1]: 
     result.append(i) 

print(result) 

输出:

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

这个怎么样的解决方案,它更简洁海事组织。

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]] 

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