0

私は次の変数のリストとマスター変数を持っています

a = (1,5,7)

b = (1,3,5)

c = (2,2,2)

d = (5,2,8)

e = (5,5,8)

mastervariable = (3,2,5)

各変数の2つの要素がマスター変数に存在するかどうかを確認しようとしています。これにより、上記では、B(3,5)とD(5,2)が、マスター変数で少なくとも2つの要素が一致する要素として表示されます。また、セットを使用するとCがmatchignとして表示されますが、Cをカウントしたくないので、Cの要素の「1つ」のみがmastervariableにあります(つまり、2はmastervariableに2回ではなく1回だけ表示されます)。

私は現在非常に非効率的です:

if current_variable[0]==mastervariable[0]:
            if current_variable[1] = mastervariable[1]:
                        True                        
            elif current_variable[2] = mastervariable[1]:
                        True       

  #### I don't use OR here because I need to know which variables match.

elif current_variable[1] == mastervariable[0]:   ##<-- I'm now checking 2nd element
            etc. etc.

次に、非常に非効率的な方法で1つずつチェックすることにより、上記のように繰り返します。FORステートメントを使用すると、最初の要素を2回チェックすることになり、これは正しくありませんでした。

For i in a:
      for j in a:
           ### this checked if 1 was in the master variable and not 1,5 or 1,7

すでに使用されている要素をスキップしながら、リスト内の2つの要素を一度にチェックできる2 FORステートメントを使用する方法はありますか?または、私が試していることを効率的に行う方法を提案できますか?

編集:マスター変数には重複が含まれる可能性があります。

4

2 に答える 2

1

セットにとっては良い仕事のようです。編集:mastervariableには重複が含まれている可能性があるため、セットは適切ではありません。こちらがカウンターを使ったバージョンです。

>>> a = (1,5,7)
>>> 
>>> b = (1,3,5)
>>> 
>>> c = (2,2,2)
>>> 
>>> d = (5,2,8)
>>> 
>>> e = (5,5,8)
>>> D=dict(a=a, b=b, c=c, d=d, e=e)
>>> 
>>> from collections import Counter
>>> mastervariable = (5,5,3)
>>> mvc = Counter(mastervariable)
>>> for k,v in D.items():
...  vc = Counter(v)
...  if sum(min(count, vc[item]) for item, count in mvc.items())==2:
...   print k
... 
b
e
于 2012-07-26T01:52:49.050 に答える
1

一致する要素を複製してset中断できる場合は、マルチセットとして使用します。とCounterの間の複製は次のように検出されます。amaster

count_a = Counter(a)
count_master = Counter(master)
count_both = count_a + count_master
dups = Counter({e : min((count_a[e], count_master[e])) for e in count_a if count_both[e] > count_a[e]})

aロジックはかなり直感的です。との合計数にアイテムが多い場合master、それは複製されますが、多重度はそのアイテムの多くであり、アイテムの数amaster少なくなります。

これは、すべての重複のカウンターを提供します。ここで、カウントはそれらの多重度です。タプルとして戻したい場合は、次のようにすることができますtuple(dups.elements())

>>> a
(2, 2, 2)
>>> master
(1, 2, 2)
>>> dups = Counter({e : min((count_a[e], count_master[e])) for e in count_a if count_both[e] > count_a[e]})
>>> tuple(dups.elements())
(2, 2)
于 2012-07-26T02:20:10.597 に答える