【问题标题】:Python list intersection with non unique itemsPython列表与非唯一项的交集
【发布时间】:2012-08-28 12:22:29
【问题描述】:

我有两个字符串,我希望它们上有交集包括重复项:

str_a = "aabbcc"
str_b = "aabd"

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

我想退货:

>> "aab"

有什么想法吗?

【问题讨论】:

  • 为什么是"aab" 而不是"aaaabbb""aabb"
  • 因为这就是我想要的。功能性问题是:给我所有可以从给定字母输入 (str_b) 构造的单词 (str_a)。
  • 是的,但是您应用了什么规则才能得出正确的答案?如果您只想对这两个特定的字符串进行操作,您可以将其硬编码到 if 语句中。
  • 是的,但显然这是我真正想做的精简版。如果我的问题可以用几行来显示,那么让人们阅读大量行是没有意义的......
  • 这仍然没有告诉我们这里的规则应该是什么。在你告诉我们之前,这个问题没有明确说明。碰巧有一个 python 库可以正确执行这个操作,这很好,但是这个问题仍然没有明确说明。

标签: python intersection multiset


【解决方案1】:

Multisets 在 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()的可迭代格式。

【讨论】:

  • 这根本不是他想要的。他想要字符串的交集
  • 这是元素的并集,而不是交集。
  • @Blckknght:抱歉,正在修复
  • @ninjagecko:不完全是,您的intersection 输出不正确,而且也令人困惑。
  • @ninjagecko:您的代码行>>> intersection = ... 不会在终端上回显输出。您缺少明确的>>> intersection。此外,在您编辑 Counter([{..}]) 输出之前,您的示例是不正确的。最后但并非最不重要的一点是,当我输入答案并在提示下进行测试时,您的答案仍然很不正确。我可以向你保证,如果我们的答案看起来相似,那完全是巧合。
【解决方案2】:

对每个单词使用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'

Counterdict 的子类,但它会计算初始化序列的所有元素。因此,"aabbcc" 变为 Counter({'a': 2, 'b': 2, 'c': 2})

计数器的作用类似于多重集,因为当您在上述交叉点中使用 2 时,它们的计数设置为任一计数器中的最小值,忽略任何计数降至 0 的值。如果要计算它们的并集,则最大个计数将被使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多