我有两个字符串,我想在它们之间找到交集,并且这些交集中包含重复项:
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
对象。您可以执行与集合相同的许多操作,例如并集、交集、差集(虽然计数可能变为负数)等:
多重集合是指允许有重复元素的集合。相比之下,普通集合不允许有重复元素。使用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()
。>>> intersection = ...
不会在终端上输出结果。你缺少一个明确的 >>> intersection
。此外,在你编辑 Counter([{..}])
输出之前,你的示例是不正确的。最后但并非最不重要的是,在我输入答案并在提示符上测试它时,你的答案仍然相当不正确。我可以向你保证,如果我们的答案看起来相似,那完全是巧合。 - Martijn Pieters使用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})
。
计数器(Counter)
就像多重集合(multisets),当你在上面使用2来进行交集运算时,它们的数量会被设置为在任一计数器中找到的最小值,忽略任何数量降至0的元素。如果您要计算它们的并集,则将使用最大计数而不是最小计数。
"aab"
而不是"aaaabbb"
或"aabb"
? - Marcin