我正在尝试使用以下规范处理列表并集算法:如果L1中的元素出现在L1中比L2中出现的更多,则union应返回最大出现次数,即它的数量在L1中发生L1和L2的角色,如果元素出现在L2中比在L1中出现的更多。如果L1和L2不相交,则union只返回常规集合。到目前为止,我的思考过程一直是:
count
更大。我正在考虑使用max
函数来告诉Python返回列表,其中union中每个元素的多重性是L1和L2中元素的最大出现次数。想法?
答案 0 :(得分:4)
这是collections
标准模块的完美工作,该模块提供多集:
from collections import Counter
result_list = list((Counter(list1)|Counter(list2)).elements())
Counter
对象在这里表示一个多集(通常多于1个元素的副本集),union运算符|
保持每个元素的最大计数,elements()
返回迭代器,返回每个元素与其计数对应的次数。
如果您确实不需要列表但可以在代码中使用多重集,则Counter(list1) | Counter(list2)
是您需要的联合multiset。
答案 1 :(得分: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)]
答案 2 :(得分:1)
你可以使用带有计数值的dicts。联盟逻辑是:
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)]
答案 3 :(得分:-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)]