13

2つの文字列があり、重複するアイテムを含めてそれらに交差点を設定したいと思います。

str_a = "aabbcc"
str_b = "aabd"

list(set(str_a) & set(str_b))
>> "ab"

私はそれを返してもらいたい:

>> "aab"

何か案は?

4

2 に答える 2

19

マルチセットは、Python 2.7以降で(可変)Counterオブジェクトとして実装されます。和集合、共通部分、差(ただし、カウントは負になる可能性があります)など、セットに対して実行できるのと同じ操作の多くを実行できます。

from collections import Counter as mset

解決:

(mset("aabbcc") & mset("aabd")).elements()

詳細:

>>> intersection = mset("aabbcc") & mset("aabd")
Counter({'a': 2, 'b': 1})

>>> list(intersection.elements())
['a', 'a', 'b']

>>> ''.join(intersection.elements())
'aab'

''.join文字列が必要な場合、またはリストが必要な場合に使用できますがlist()、私はそれを.として反復可能な形式で保持しますintersection.elements()

于 2012-09-03T19:58:29.257 に答える
9

各単語に使用collections.Counterし、これらをセットとして使用します。

>>> from collections import Counter
>>> str_a, str_b = 'aabbcc', 'aabd'
>>> Counter(str_a) & Counter(str_b)
Counter({'a': 2, 'b': 1})
>>> ''.join((Counter(str_a) & Counter(str_b)).elements())
'aab'

はサブクラスですが、初期化するシーケンスのすべての要素をカウントCounterするサブクラスです。dictしたがって、に"aabbcc"なりCounter({'a': 2, 'b': 2, 'c': 2})ます。

カウンターはマルチセットのように機能します。上記のような交差点で2を使用すると、カウントはいずれかのカウンターで見つかった最小値に設定され、カウントが0に低下したものはすべて無視されます。それらの和集合を計算する場合、最大カウントは次のようになります。代わりに使用してください。

于 2012-09-03T20:05:03.483 に答える