1

我现在正在尝试使用列表联合算法,具有以下规范:如果 L1 中的元素在 L1 中出现的次数多于在 L2 中出现的次数,则联合应该返回最大出现次数,即它在 L1 中出现的数量,如果一个元素在 L2 中出现的次数多于在 L1 中出现的次数,则 L1 和 L2 的角色会切换。如果 L1 和 L2 不相交,则并集只返回常规集合并集。到目前为止,我的思考过程是:

  1. 遍历 L1。
  2. 检查 L1 中的任何元素是否也在 L2 中。
  3. 如果 L1 中的元素也在 L2 中,则检查哪个列表具有较大count的元素。
  4. 如果 L1 和 L2 不相交,则返回正则集合并集。
  5. 反转 L2 和 L1 重复步骤 3。
  6. 归还工会。

我正在考虑使用该max函数来告诉 Python 返回列表,其中联合中每个元素的多重性是 L1 和 L2 中元素的最大出现次数。想法?

4

4 回答 4

4

对于标准模块来说,这是一项完美的工作collections,它提供了多组:

from collections import Counter

result_list = list((Counter(list1)|Counter(list2)).elements())

一个Counter对象在这里表示一个多重集(通常是其元素的多个副本的集合),联合运算符|保持每个元素的最大计数,并elements()返回一个迭代器,其中每个元素返回与其计数对应的次数。

如果您真的不需要列表但可以在代码中使用多重集,那么您需要Counter(list1) | Counter(list2)的联合多重集。

于 2013-02-15T07:09:58.347 回答
1
from collections import Counter

counts = Counter(L1)
for value, count in Counter(L2).items()
    counts[value] = max(counts[value], count)
newlist = [value for value, count in counts.items() for _ in range(count)]
于 2013-02-15T04:28:24.460 回答
1

您可能只使用计数作为值的字典。联合逻辑是:

counts = {i: max(L1.get(i,0), L2.get(i,0)) for i in set(L1)|set(L2) }

最终名单是

newlist = [value for value, count in counts.items() for _ in range(count)]
于 2013-02-15T22:06:01.483 回答
-1

仅使用列表及其最大/最小属性的解决方案可能是

union = [] 
[union.extend([n] * max(l1.count(n), l2.count(n))) for n in range (min(min(l1),min(l2)), max(max(l1),max(l2))+1)]
于 2013-02-16T03:23:57.763 回答