(长篇但完整阅读,解决方案在最后)。
删除找到的值或将其注册到另一个字典中。
更好的方法是计算每个数组中的幻影数量并测试有多少是常见的。
对于第二种情况,你会有
将这些值保存在字典中:
a_app = {3:1, 2:1, 5:1, 4:1}
b_app = {2:2, 4:1}
现在,很简单:
for i in b:
if a_app.has_key(i) and a_app[i] > 0:
a_app[i] -= 1
字典将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])
这是输出:
$ 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 => .
一切都很完美,没有订单丢失:)
编辑:用@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])