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