2

我有一个 2D 列表列表,我正在对它做一些事情并得到一个稍微修改的 2d 列表列表。在我取回新列表之前,我无法跟踪正在进行的更改。我想获取所有已更改的项目的列表, [[1,2,3], [4,5,6], [7,8,9]][[1,None,3], [4,None,6], [7,None, None]]会得到一个列表[(0,1), (1,1), (2, 1), (2,2)],我知道你通常可以这样做list(set(a)-set(b)),但是当我尝试它时,我得到了TypeError: unhashable type: 'list'那么最有效的方法是什么?

4

3 回答 3

4

使用zip,enumerate和生成器函数:

def diff(lis1, lis2):
    for i, (x, y) in enumerate(zip(lis1, lis2)):
        for j, (x1, y1) in enumerate(zip(x, y)):
            if x1 != y1:
                yield i, j
...                 
>>> lis1 = [[1,2,3], [4,5,6], [7,8,9]]
>>> lis2 = [[1,None,3], [4,None,6], [7,None, None]]
>>> list(diff(lis1, lis2))
[(0, 1), (1, 1), (2, 1), (2, 2)]
于 2013-09-29T20:03:06.123 回答
3

使用列表理解:

>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> b = [[1,None,3], [4,None,6], [7,None, None]]
>>> [(i,j) for i, row in enumerate(a) for j, x in enumerate(row) if b[i][j] != x]
[(0, 1), (1, 1), (2, 1), (2, 2)]
于 2013-09-29T19:58:44.653 回答
0

如果列表具有常规结构,即每个子列表具有相同的长度,并且您不介意使用外部包,numpy可以提供帮助。

import numpy as np
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
b = np.array([[1,None,3], [4,None,6], [7,None, None]])

print(np.where(a!=b))

>>>(array([0, 1, 2, 2]), array([1, 1, 1, 2]))
于 2013-09-29T20:34:02.330 回答