对于日志解析器的一部分,我需要在日志中过滤波特率的出现。
首先,我使用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。请告知:有没有更有效的方法,或者我甚至不需要再发明轮子?
答案 0 :(得分:5)
>>> 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)
m
。n
的最后一个元素是否等于列表m
的当前元素。m
的当前元素附加到列表' n`。n
为空代码:
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]