我有两个字符串,我希望它们上有交叉点,包括重复项:
str_a = "aabbcc"
str_b = "aabd"
list(set(str_a) & set(str_b))
>> "ab"
我想让它返回:
>> "aab"
有任何想法吗?
我有两个字符串,我希望它们上有交叉点,包括重复项:
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 的任何内容。如果您要计算它们的并集,则最大计数将改为使用。