5

アイテムが入っているかどうかbaおよび見つかった一致アイテムがa次のマッチングで使用されないかどうかを確認するにはどうすればよいですか?

現在、このコードはの2つに一致しbます。

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

for i in b:
  if i in a:
    print "%d is in a" % i

これは必要な出力です:

2 => 2 is in a
4 => 4 is in a
2 =>

編集:例2:

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

出力は

2 => 2 is in a
4 => 4 is in a
2 => 2 is in a
4

5 に答える 5

11

(長い投稿ですが、完全に読んでください。解決策は最後です)。

見つかった値を削除するか、別の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])
于 2012-07-11T10:47:12.423 に答える
3

私はこれを行います:

a = [3,2,5,4]
b = [2,4,2]
temp = set(a)
for item in b:
    if item in temp:
        print "{0} is in a".format(item)
        temp.remove(item)

このセットにより、x in yチェックが高速になり(O(1)(最悪の場合)ではなくO(n))、元のを破壊することなく安全に変更することもできますa

于 2012-07-11T10:42:53.827 に答える
3

再帰的ソリューション:

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

def find_matches(x, y):
    if y == []:            # nothing more to find
        return
    n = y.pop()
    if n in x:
        print n, "matches"
        x.remove(n)
    find_matches(x, y)

find_matches(list(a), list(b))      # copy the list as they get consumed in process
于 2012-07-11T10:45:51.910 に答える
0

これはおそらく最善の方法ではありませんが、一致するすべてのアイテムのリストを作成し、それを使用して確認することができます。

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

for i in b:
    if i in a and i not in c:
        print '%d is in a' % i
        c.append(i)

bの代わりにループすることで問題が解決すると思います。

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

for i in a:
    if i in b:
        print i, 'is in a'

明らかにiありますがa、それは問題を解決しますね?

于 2012-07-11T10:44:10.353 に答える
0
a = [3,2,5,4]
b = [2,4,2]

hadAlready = {}
for i in b:
    if i in a:
        if not (i in hadAlready):
            print "%d is in a" % i
            hadAlready[i] = 1
于 2012-07-11T10:44:50.120 に答える