在Python中列出联合算法

时间:2013-02-15 04:19:45

标签: python algorithm

我正在尝试使用以下规范处理列表并集算法:如果L1中的元素出现在L1中比L2中出现的更多,则union应返回最大出现次数,即它的数量在L1中发生L1和L2的角色,如果元素出现在L2中比在L1中出现的更多。如果L1和L2不相交,则union只返回常规集合。到目前为止,我的思考过程一直是:

  1. 通过L1迭代。
  2. 检查L1中的任何元素是否也在L2中。
  3. 如果L1中的元素也在L2中,请检查哪个列表中元素的count更大。
  4. 如果L1和L2不相交,则返回常规集合。
  5. 重复步骤3,L2和L1反转。
  6. 归还工会。
  7. 我正在考虑使用max函数来告诉Python返回列表,其中union中每个元素的多重性是L1和L2中元素的最大出现次数。想法?

4 个答案:

答案 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)]