像UNION一样组合2个列表,即在2个列表之间保留1个共同项目的副本,并附加其他 [英] Combining 2 lists like UNION ie keeping 1 copy of mutual items between 2 lists and appending others
本文介绍了像UNION一样组合2个列表,即在2个列表之间保留1个共同项目的副本,并附加其他的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已对其进行编辑.我把它们列在字典上.如果a和b是2个字典:
a = {'UK':'http://www.uk.com', 'COM':['http://www.uk.com','http://www.michaeljackson.com']}
bb = {'Australia': 'http://www.australia.com', 'COM':['http://www.Australia.com', 'http://www.rafaelnadal.com','http://www.rogerfederer.com']}
我想结合他们
{'Australia': ['http://www.australia.com'], 'COM': ['http://www.uk.com', 'http://www.michaeljackson.com', 'http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': ['http://www.uk.com']}
我要合并它们,即
**How to do it in Python without overwwriting and replacing any value?**
推荐答案
考虑使用其他数据结构,例如集合字典.
Consider using a different data structure, such as a dictionary of sets.
a = [['UK', ['http://www.uk.com']], ['COM', ['http://www.uk.com'],['http://www.michaeljackson.com']]]
b = [['Australia', ['http://www.australia.com']], ['COM', ['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']]]
# convert these to dictionaries with set values
a = {item[0]:set(s[0] for s in item[1:]) for item in a}
b = {item[0]:set(s[0] for s in item[1:]) for item in b}
# define a function to update our dictionary-of-sets data structure
def union_update_setdict(D, *setdicts):
"""Update dictionary D (with `'key':set(value)` items) with items from setdicts.
If a new key is added to D from setdicts, a shallow copy of the value
is added to D.
"""
for setdict in setdicts:
for k,v in setdict.items():
try:
D[k].update(v)
except KeyError:
D[k] = v.copy()
union_update_setdict(a, b)
# Now let's test that the code works
expected = [['UK', ['http://www.uk.com']], ['COM', ['http://www.uk.com'], ['http://www.michaeljackson.com'], ['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']], ['Australia', ['http://www.australia.com']]]
# put the "expected" results in our new data structure for comparison
expected = {item[0]:set(s[0] for s in item[1:]) for item in expected}
print a
assert expected == a
如果您确实需要继续使用可怕的数据结构,则可以在完成后将其转换回去:
If you really need to keep using your terrible data structure, you can convert it back when you are finished:
terribledatastruct = [[k]+[[item] for item in v] for k,v in a.items()]
print terribledatastruct
这篇关于像UNION一样组合2个列表,即在2个列表之间保留1个共同项目的副本,并附加其他的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文