开发者

list union with duplicates

开发者 https://www.devze.com 2023-04-05 06:10 出处:网络
I need to unite two lists in Python3,where duplicates can exist,and for 开发者_Python百科one set of these the resulting list will contain as many as max in both lists.An example might clarify it:

I need to unite two lists in Python3,where duplicates can exist,and for 开发者_Python百科one set of these the resulting list will contain as many as max in both lists.An example might clarify it:

[1,2,2,5]( some operator)[2,5,5,5,9]=[1,2,2,5,5,5,9]

Ideas?


You can use the collections.Counter class:

>>> from collections import Counter
>>> combined = Counter([1,2,2,5]) | Counter([2,5,5,5,9])
>>> list(combined.elements())
[1, 2, 2, 5, 5, 5, 9]

It functions as a multiset (an unordered collection where each element can appear multiple times). The | operator gives you the union of the multisets, where each element appears max(apperances_in_counter1, appearances_in_counter2) times.

This class was added in Python 2.7 and 3.1.


Why use lists in the first place? That data looks like a dict to me:

[1,2,2,5] -> {1: 1, 2: 2, 5: 1}
[2,5,5,5,9] -> {2: 1, 5: 3, 9: 1}

Then it's simple:

keys = set(a.keys()+b.keys())
vals = [max(a.get(n, 0), b.get(n, 0)) for n in keys]
d = dict(zip(keys, vals))
print d

Result:

{1: 1, 2: 2, 5: 3, 9: 1}


  1. Convert arrays to dictionaries with a[key] = count

  2. Create new dictionary with rules c[key] = a.get(key, 0) > b.get(key, 0) and a[key] or b[key]. You need to iterate through both keys in a and in b dicts.

  3. Expand dictionary, result += [value] * key

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号