繁体   English   中英

Python:将此行与下一行进行比较

[英]python: comparing this row with next row

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]发生了变化

我如何抓住这个变化? 我也想知道此更改发生在哪一行

如果您有矩阵数据,则基本上需要第一个“列”的差异。 您可能想要报告更改和更改位置,并可能要稀疏地存储它们:

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

使用变量来跟踪上一个项目。

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

我将其作为单独的答案发布,以避免使其他答案过于混乱

>>> for i in range(1,len(c1)):
...  if c1[i-1][0]!=c[i][0]: break
...
>>> print i
2

打印所有行的列表,这些行的第一个元素与其前一个元素不同:

import itertools

c1=[[1,2,3],[1,2,6],[7,8,6]]

xs, ys = itertools.tee(c1)
next(ys)
print [y for x, y in itertools.izip(xs, ys) if x[0] != y[0]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM