Skip to main content
 首页 » 编程设计

python之从列表的子序列中删除重复项

2025年05月04日15cloudgamer

对于日志解析器的一部分,我需要过滤日志中出现的波特率。

首先,我使用 re.findall 获取所有匹配项,然后尝试删除其结果中子序列中的重复项。结果类似于 [10000,10000,10000,10000,0,0,0,10000,10000],该列表可以包含数百个值。所以第一个波特率是 10000,然后是 0,然后又是 10000。 我需要查看波特率如何变化,所以我不能使用set,因为它会丢失波特率切换点的信息。

所以,再次输入:[10000,10000,10000,10000,0,0,0,10000,10000]

期望的输出:[10000,0,10000]

我已经做了什么:

m = [10000,10000,10000,10000,0,0,0,10000,10000]  
n = [] 
for i,v in enumerate(m): 
    if i == 0: 
        n.append(v) 
        n_index = 0 
    else: 
        if v != n[n_index]: 
            n.append(v) 
            n_index = n_index + 1 

它有效,但对我来说它似乎不够 pythonic。请指教:有没有更有效的方法,或者我什至不需要重新发明轮子?

请您参考如下方法:

使用itertools.groupby :

>>> rates = [10000,10000,10000,10000,0,0,0,10000,10000] 
>>> from itertools import groupby 
>>> [e for e, g in groupby(rates)] 
[10000, 0, 10000] 

说明:如果没有给出key函数,那么元素只是按身份分组,即折叠连续相等元素的组。结果是关键元素和组的迭代器(在这种情况下,只是关键元素的重复)。我们只需要 key 。

更新:使用 IPython 的 %timeit 魔术命令和 100,000 个随机波特率列表,itertools.groupby 似乎与“与前一个元素比较”一样快loop”解决方案,而且更短。