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]
我如何抓住这一变化? 我也想知道这个改变了哪一行发生在
答案 0 :(得分: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])
答案 1 :(得分: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]:
答案 2 :(得分: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 :(得分:1)
我已将此作为单独的答案发布,以避免让其他答案过于混乱
>>> for i in range(1,len(c1)):
... if c1[i-1][0]!=c[i][0]: break
...
>>> print i
2
答案 4 :(得分:1)
使用与其前一个元素不同的第一个元素打印所有行的列表:
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]]