比较两个数组并获得不常见的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较两个数组并获得不常见的值相关的知识,希望对你有一定的参考价值。

我正在做这个问题,朋友给了我两个阵列说(a [1,2,3,4]和b [8,7,9,2,1]),你必须找到不常见的元素。预期产出为[3,4,8,7,9]。代码如下。

def disjoint(e,f):
c = e[:]
d = f[:]
for i in range(len(e)):
    for j in range(len(f)):
        if e[i] == f[j]:
            c.remove(e[i])
            d.remove(d[j])
final = c + d
print(final)

print(disjoint(a,b))

我尝试使用嵌套循环并创建给定数组的副本来修改它们然后添加它们但是......

def disjoint(e,f):
c = e[:]                      # list copies
d = f[:]
for i in range(len(e)):
    for j in range(len(f)):
        if e[i] == f[j]:
            c.remove(c[i])     # edited this line
            d.remove(d[j])
final = c + d
print(final)

print(disjoint(a,b))

当我尝试从列表副本中删除公共元素时,我得到不同的输出[2,4,8,7,9]。为什么?这是我在本网站的第一个问题。如果有人能清除我的疑虑,我将感激不尽。

答案

您可以简化代码以使其有效:

def disjoint(e,f):
    c = e.copy() # [:] works also, but I think this is clearer
    d = f.copy()
    for i in e: # no need for index. just walk each items in the array
        for j in f:
            if i == j: # if there is a match, remove the match.
                c.remove(i)
                d.remove(j)
    return c + d

print(disjoint([1,2,3,4],[8,7,9,2,1]))

Try it online!

有很多更有效的方法来实现这一目标。检查这个堆栈溢出问题以发现它们:Get difference between two lists。我最喜欢的方式是使用set(就像在@newbie的答案中)。什么是set?让我们检查一下documentation

set对象是不同的可哈希对象的无序集合。常见用途包括成员资格测试,从序列中删除重复项,以及计算数学运算,如交集,并集,差异和对称差异。 (对于其他容器,请参阅内置的dict,list和tuple类以及collections模块。)

强调我的

对称差异非常适合我们的需求!

返回一个新集合,其中包含set或指定的iterable中的元素,但不能同时返回两者。

好的,在这里如何使用它:

def disjoint(e,f):
    return list(set(e).symmetric_difference(set(f)))

print(disjoint([1,2,3,4],[8,7,9,2,1]))

Try it online!

另一答案

使用sets你可以做:

a = [1,2,3,4]
b = [8,7,9,2,1]
diff = (set(a) | set(b)) - (set(a) & set(b))

(set(a) | set(b))是联盟,set(a) & set(b)是交集,最后你用-做两组之间的区别。

当您删除行c.remove(c[i])d.remove(d[j])中的元素时,会出现错误。实际上,共同的元素是e[i]and f[j],而cd是你正在更新的列表。 要修复你的bug你只需要将这些行改为c.remove(e[i])d.remove(f[j])

另请注意,如果列表可能包含重复项,则删除两个列表中项目的方法将不起作用。例如,考虑a = [1,1,2,3,4]b = [8,7,9,2,1]的情况。

以上是关于比较两个数组并获得不常见的值的主要内容,如果未能解决你的问题,请参考以下文章

比较java中的两个数组

比较它们之间的元素并获取共同值的键

比较两个excel文件并返回不常见的行

如何获得Int数组中最常见的值? (C#)

java常见数据算法_冒泡排序

OpenCV比较两个图像并获得不同的像素