仅删除python列表中特定相邻重复项的一半

时间:2018-07-29 05:04:09

标签: python list duplicates

我有一个输出一些数据的工具。众所周知,每当数据中包含“ 10”时,就会在数据中添加额外的“ 10”,即新数据变为...“ 10”,“ 10”,...。有时连续序列中可能有4个“ 10”,这意味着实际上有2个“ 10”。

在读取数据时,我试图删除重复项。到现在为止,我已经学习了如何仅找到两个相邻的重复项,但是却发现偶数个重复项的同时删除一半的重复项。

x = [ '10', '10', '00', 'DF', '20' ,'10' ,'10' ,'10' ,'10', ....]

预期输出

[ '10', '00' , 'DF', ' 20', ' 10', '10' ..]

3 个答案:

答案 0 :(得分:1)

您可以尝试使用groupby()中的itertools

X= [ '10', '10', '00', 'DF', '20' ,'10' ,'10' ,'10' ,'10']

from itertools import groupby

result = []
for k, g in groupby(X) :
    group = list(g)
    if k == '10' :
        result.extend(group[:(len(group)+1)/2])
    else :
        result.extend(group)
print result

给予:

['10', '00', 'DF', '20', '10', '10']

答案 1 :(得分:0)

纯python方法

ls = []
dupe = True
for item in x:
    if ls and ls[-1] == item and dupe:
        dupe = False
        continue
    dupe = True
    ls.append(item)

['10', '00', 'DF', '20', '10', '10']

答案 2 :(得分:0)

应准确处理所有重复项的更新版本:

res = []
temp = []

for i in range(1, len(x)):
    if x[i-1] == x[i]:
        temp.append(x[i-1])
    else:
        res.extend(temp[:len(temp)//2])
        temp = []
        res.append(x[i-1])

res.extend(temp[:len(temp)//2])

if x:
    res.append(x[-1])

print(res)

我的方法是检查每个元素,将其与前一个元素进行比较,然后将所有重复项放入缓冲区中。对于任何不相等的比较,请将缓冲区的一半转储到结果中,清除缓冲区并将最左边的元素放入结果数组中。

如有必要,将if x[i-1] == x[i]:更改为if x[i-1] == x[i] and x[i] == '10':会将重复项限制为"10"

repl上玩它,让我知道是否找到我错过的任何边缘情况。