多维数组python的交集

时间:2017-07-11 12:10:07

标签: python arrays multidimensional-array

我有一些像这样的多维数组:

a=[[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 1],[1, 1],[1, 1],[1, 5],[5, 12],[12, 6]]
b=[[0, 0],[0, 0],[0, 0],[0, 0],[0, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 5],[5, 12],[12, 6]]

我想在python中获得他们的交集。 所以我编码        c=[v for v in a if v in b]

我想[[0, 0],[0, 0],[0, 0],[0, 0],[0, 1],[1, 1],[1, 1],[1, 5],[5, 12],[12, 6]],但代码回答错误。

2 个答案:

答案 0 :(得分:1)

如果您从b中删除已经迭代的元素,就可以联系到res ab之间相同元素的最小交叉点}。

a=[[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 1],[1, 1],[1, 1],[1, 5],[5, 12],[12, 6]]
b=[[0, 0],[0, 0],[0, 0],[0, 0],[0, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 5],[5, 12],[12, 6]]

res = []
for _a in a:
  if _a in b:
    res.append(_a)
    b.remove(_a)

print (res)

>>> [[0, 0], [0, 0], [0, 0], [0, 0], [0, 1], [1, 1], [1, 1], [1, 5], [5, 12], [12, 6]]

修改

您可以遍历a并获取元素匹配项的数量,对b执行相同的操作,并将res列表扩展为occurence_count_a和{之间的最小值{1}}

不要忘记在顶部检查元素是否已经在occurence_count_b列表中,您不需要再次扩展它,因为每次迭代都可以将元素扩展到{{ 1}}(取决于resres之间的交集)所以当你得到之前迭代的值时,你不需要担心他延长{{1之前与此元素的最小交集。

a

答案 1 :(得分:0)

您的代码存在的问题是,它只检查列表a中是否存在列表b的元素,而不管其中是否完全或多少次。试试这个:

a=[[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 1],[1, 1],[1, 1],[1, 5],[5, 12],[12, 6]]
b=[[0, 0],[0, 0],[0, 0],[0, 0],[0, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 1],[1, 5],[5, 12],[12, 6]]

from collections import Counter as cC

ac = cC([tuple(x) for x in a])
bc = cC([tuple(x) for x in b])
print(ac)
print(bc)
c = sorted([list(x) for x, v in (ac & bc).items() for _ in range(v)])
print(c)  # [[0, 0], [0, 0], [0, 0], [0, 0], [0, 1], [1, 1], [1, 1], [1, 5], [5, 12], [12, 6]]