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

python:将此行与下一行进行比较,python,list,Python,List,c1是这样的列表列表: c1=[[1,2,3],[1,2,6],[7,8,6]] for row in c1: 我想跟踪行[0]中是否有更改 例如: 在[1,2,3]和[1,2,6]中,行[0] 但是在[1,2,6]和[7,8,6]中,行[0] 我怎么才能赶上这个变化? 另外,我想知道更改发生在哪一行,请使用变量跟踪上一项 prev = None for row in c1: if prev is not None and prev != row[0]: # there is

c1
是这样的列表列表:

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

for row in c1:
我想跟踪
行[0]中是否有更改

例如:

[1,2,3]
[1,2,6]
中,
行[0]

但是在
[1,2,6]
[7,8,6]
中,
行[0]

我怎么才能赶上这个变化?
另外,我想知道更改发生在哪一行,请使用变量跟踪上一项

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

使用变量跟踪上一项

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]:
要获得更改的行,可以查看结果的第一个元素的长度

>>> len(list(next(groupby(c1,itemgetter(0)))[1]))
2
要获得更改的行,可以查看结果的第一个元素的长度

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

我将此作为一个单独的答案发布,以避免另一个答案过于混乱

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

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

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

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

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

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

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

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

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

你能详细说明一下什么构成行中的更改吗?在第一个示例中,行[0]是1和1,但在第二个示例中,行[0]是1和7(这是更改),你能详细说明一下什么构成行中的更改吗?在第一个示例中,行[0]是1和1,但在第二个示例中,行[0]是1和7(这是更改)这也是我思考的方向。虽然我想的不是groupby,而是将元素放在一个集合中(或一个多集合以保持计数)。如何让最后一行给出发生更改的行,而不是address@l__itemgetter获取每个输入的第一个元素。groupby进行迭代,因此itemgetter获取[1,2,3]中的第一个元素、[1,2,6]中的第一个元素,依此类推。@l\u\u您实际上是在添加一个需求。您想知道更改是否发生,而不是发生在何处。@extranon,
set(x[0]表示c1中的x)
是一种检测更改的简单方法。我一定预料到了额外的要求:)这也是我思考的方向。虽然我想的不是groupby,而是将元素放在一个集合中(或一个多集合以保持计数)。如何让最后一行给出发生更改的行,而不是address@l__itemgetter获取每个输入的第一个元素。groupby进行迭代,因此itemgetter获取[1,2,3]中的第一个元素、[1,2,6]中的第一个元素,依此类推。@l\u\u您实际上是在添加一个需求。您想知道更改是否发生,而不是发生在何处。@extranon,
set(x[0]表示c1中的x)
是一种检测更改的简单方法。我必须预料到额外的要求:)设置
prev
eg的安全方法,如果
None
可能是第一行的第一个元素,则使用
prev=object()
设置
prev
eg的安全方法,如果有可能
None
成为第一行的第一个元素,则使用
prev=object()