(长文章,但请通读,解决方案在最后)。
删除找到的值或将其注册到另一个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}
现在,很简单: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])