python: 比较当前行与下一行
c1
是一个包含多个列表的列表,长得像这样:
c1=[[1,2,3],[1,2,6],[7,8,6]]
for row in c1:
我想记录一下 row[0]
是否发生了变化。
举个例子:
在 [1, 2, 3]
和 [1, 2, 6]
之间,row[0]
没有变化。
但是在 [1, 2, 6]
和 [7, 8, 6]
之间,row[0]
就发生了变化。
我该怎么捕捉到这个变化呢?
另外,我也想知道这个变化发生在哪一行。
5 个回答
2
>>> from operator import itemgetter
>>> from itertools import groupby
>>> c1=[[1,2,3],[1,2,6],[7,8,6]]
>>> list(groupby(c1,itemgetter(0)))
[(1, <itertools._grouper object at 0xa6f8d0>), (7, <itertools._grouper object at 0xa6f890>)]
这句话的意思是把c1中的元素按照每个元素的第一个项目进行分组。
你还可以把结果展开成一个嵌套列表,这样就能看到这些项目是怎么分组的。
>>> [(x,list(y)) for x,y in (groupby(c1,itemgetter(0)))]
[(1, [[1, 2, 3], [1, 2, 6]]), (7, [[7, 8, 6]])]
要获取变化的行数,你可以查看结果中第一个元素的长度。
>>> len(list(next(groupby(c1,itemgetter(0)))[1]))
2
3
如果你有一个矩阵数据,基本上你想要的是第一个“列”的差异。你可能想要报告这些变化以及变化发生的位置,并且可能希望以稀疏的方式存储它们:
c1=[[1,2,3],[1,2,6],[7,8,6]]
ans=[] # a list of [indices,differences]
col=0
for i in range(len(c1)-1):
diff = c1[i+1][col]-c1[i][col]
if diff!=0:
ans.append([i,diff])
2
用一个变量来记录上一个项目。
prev = None
for row in c1:
if prev is not None and prev != row[0]:
# there is a change
prev = row[0]
...只要确保你用一个不存在的值作为起始值(如果你的列表可能包含任何东西,可以用一个额外的标记来表示第一个项目)。如果你想把第一行也算作一次变化,就把if
改成:
if prev is None or prev != row[0]: