2つの文字列があり、重複するアイテムを含めてそれらに交差点を設定したいと思います。
str_a = "aabbcc"
str_b = "aabd"
list(set(str_a) & set(str_b))
>> "ab"
私はそれを返してもらいたい:
>> "aab"
何か案は?
2つの文字列があり、重複するアイテムを含めてそれらに交差点を設定したいと思います。
str_a = "aabbcc"
str_b = "aabd"
list(set(str_a) & set(str_b))
>> "ab"
私はそれを返してもらいたい:
>> "aab"
何か案は?
マルチセットは、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()
。
各単語に使用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に低下したものはすべて無視されます。それらの和集合を計算する場合、最大カウントは次のようになります。代わりに使用してください。