(長い投稿ですが、完全に読んでください。解決策は最後です)。
見つかった値を削除するか、別のdictに登録してください。
ただし、各配列内の出現の数を数え、その数が一般的であるかどうかをテストすることをお勧めします。
2番目のケースでは、
のために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])