[英]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.