python: 比较当前行与下一行

1 投票
5 回答
11738 浏览
提问于 2025-04-16 02:15

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]:

撰写回答