我有一些像这样的多维数组:
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]]
,但代码回答错误。
答案 0 :(得分:1)
如果您从b
中删除已经迭代的元素,就可以联系到res
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]]
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}}(取决于res
和res
之间的交集)所以当你得到之前迭代的值时,你不需要担心他延长{{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]]