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

时间:2015-01-23 09:43:56

标签: python

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

首先,我使用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。请告知:有没有更有效的方法,或者我甚至不需要再发明轮子?

4 个答案:

答案 0 :(得分:5)

使用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函数,那么元素只按标识分组,即连续相等元素的组被折叠。结果是键元素和组的迭代器(在这种情况下,只是重复键元素)。我们只需要钥匙。

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

答案 1 :(得分:2)

m = [10000,10000,10000,10000,0,0,0,10000,10000] 
n = []

n.append(m[0])
for i in m[1:]:
    if n[-1] != i:
        n.append(i)
print n

答案 2 :(得分:0)

  1. 通过常规方法或枚举来迭代列表m
  2. 检查列表n的最后一个元素是否等于列表m的当前元素。
  3. 如果不相等,则将列表m的当前元素附加到列表' n`。
  4. 使用try和expect,因为第一次列表n为空
  5. 代码:

    m = [10000,10000,10000,10000,0,0,0,10000,10000] 
    n = []
    for v in m:
        try:
            if n[-1] != v:
                n.append(v)
        except IndexError:
            n.append(v)
    
    print "Result:-", n 
    

    输出:

    $ python test.py 
    Result:- [10000, 0, 10000]
    

答案 3 :(得分:0)

除了必须保存每个元素的位置外,我还必须做同样的事情。我是物理学家,所以这段代码可能很烂,但是可以用。可以删除诸如调试之类的美观内容,例如“打印”和“按任意键以继续...”。可能会适应该线程的答案之一。

xvalues=[]
M=[1,1,1,1,1,1,2,3,3,3,3,3,4,4,5,5,5,5,5,6,6,6,7,7,7,7,7,8,9,9]
print len(M)
i=0
while i < len(M):
    print "i " + str(i)
    j=i+1
    while j < len(M) and j > i:
        print "j " + str(j)
        if j == len(M)-1: #kills the while loop
            xvalues.append(i) #append the last element index
            print xvalues
            print range(i+1,len(M))
            a=raw_input("Press any key to continue...")
            i=len(M) #the loop killer
            break
        if M[i]!=M[j]:
            xvalues.append(i) #first index in the subsequence of duplicates
            print xvalues
            print range(i+1,len(M))
            a=raw_input("Press any key to continue...")
            i=j #skip to the next subsequence
            break
        if M[i]==M[j]:
            j+=1
            continue

Mnew=[M[i] for i in xvalues]
print xvalues
print Mnew

最终输出。在数组中定位,然后是该元素的值。

[0, 6, 7, 12, 14, 19, 22, 27, 28]
[1, 2, 3,  4,  5,  6,  7,  8,  9]