比较python中两个数组的值

Bob*_*Bob 4 python

我如何检查项目b是否在a,并且找到的匹配项目a不应该用于下一个匹配?

目前此代码将匹配2 in b.

a = [3,2,5,4]
b = [2,4,2]

for i in b:
  if i in a:
    print "%d is in a" % i
Run Code Online (Sandbox Code Playgroud)

这是必需的输出:

2 => 2 is in a
4 => 4 is in a
2 =>
Run Code Online (Sandbox Code Playgroud)

编辑:示例2:

a = [3,2,2,4]
b = [2,4,2]
Run Code Online (Sandbox Code Playgroud)

输出应该是

2 => 2 is in a
4 => 4 is in a
2 => 2 is in a
Run Code Online (Sandbox Code Playgroud)

Mih*_*eac 9

(很长的帖子,但完全阅读,解决方案在最后).

删除找到的值或在另一个dict中注册.

更好的方法是计算每个阵列中的外观数量,并测试有多少是常见的.

对于第二种情况,你有

  • 用于a:

    3出现1次2出现1次5次出现1次4次出现1次

  • 用于b:

    2出现2次4次出现1次

将这些值保存在词典中:

a_app = {3:1, 2:1, 5:1, 4:1}
b_app = {2:2, 4:1}
Run Code Online (Sandbox Code Playgroud)

现在,它很简单:

for i in b:
    if a_app.has_key(i) and a_app[i] > 0:
        a_app[i] -= 1
Run Code Online (Sandbox Code Playgroud)

b_app在其他情况下将使用该词典.

这是我编写的测试脚本(测试此处发布的所有测试用例):

def f(a, b):
    a_app = {}
    for i in a:
        if not a_app.has_key(i):
            a_app[i] = 0
        a_app[i] += 1
    print a_app
    for i in b:
        print i, '=>',
        if a_app.has_key(i) and a_app[i] > 0:
            a_app[i] -= 1
            print i, ' is in a',
        print '.'

f([1,1,2],[1,1])
f([3,2,5,4],[2,4,2])
f([3,2,2,4],[2,4,2])
f([3,2,5,4],[2,3,2])
Run Code Online (Sandbox Code Playgroud)

这是输出:

$ python 1.py
{1: 2, 2: 1}
1 => 1  is in a .
1 => 1  is in a .
{2: 1, 3: 1, 4: 1, 5: 1}
2 => 2  is in a .
4 => 4  is in a .
2 => .
{2: 2, 3: 1, 4: 1}
2 => 2  is in a .
4 => 4  is in a .
2 => 2  is in a .
{2: 1, 3: 1, 4: 1, 5: 1}
2 => 2  is in a .
3 => 3  is in a .
2 => .
Run Code Online (Sandbox Code Playgroud)

一切都很完美,没有订单丢失:)

编辑:更新了@Avaris的建议,此脚本如下所示:

import collections

def f(a, b):
    a_app = collections.Counter(a)
    for i in b:
        print i, '=>',
        if i in a_app and a_app[i] > 0:
            a_app[i] -= 1
            print i, ' is in a',
        print '.'
    print ''

f([1,1,2],[1,1])
f([3,2,5,4],[2,4,2])
f([3,2,2,4],[2,4,2])
f([3,2,5,4],[2,3,2])
Run Code Online (Sandbox Code Playgroud)