合并两个列表,如联合,即在两个列表之间保留一个相互项目的副本,并附加其他列表

2024-04-24 20:41:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我编辑的。我把它们列在字典里。如果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']}

我想把他们联合起来

^{pr2}$

我想把它们联合起来,即

**How to do it in Python without overwwriting and replacing any value?**

Tags: comhttp编辑字典wwwbbukaustralia
3条回答

我想在这里defaultdict可能会有帮助:

from collections import defaultdict

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']]]

d = defaultdict(list)
d.update((v[0],v[1:]) for v in a)
for v in b:
    country_or_com = v[0]
    urls = v[1:]
    d[country_or_com].extend(urls) 

这并不完全是您所要求的数据结构,但它非常接近(我认为更合适)。在

如果你真的想用你现有的格式(尽管顺序不同):

^{pr2}$

结果:

[['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']]]

如你所愿。在

如果您的列表是字典,则只需合并字典:

>>> 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']}
>>> dict(a.items()+bb.items())
{'Australia': 'http://www.australia.com', 'COM': ['http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': 'http://www.uk.com'}

更新

我的回答是:

^{pr2}$

我怀疑人们还是应该使用字典,这里有一种cpu效率不高的方法:

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']}

sk = list(set(bb.keys()+a.keys()))

nd = {}

for i in sk:
    plholder=[]
    if i in a.keys():
        print i
        print isinstance(a[i], str)
        if isinstance(a[i], str):
            plholder.append(a[i])
        else:
            if i in a.keys():
                for v in a[i]: plholder.append(v)
    if i in bb.keys():
        if isinstance(bb[i], str): plholder.append(bb[i])
        else:
            if i in a.keys():
                for v in bb[i]: plholder.append(v)
    nd[i]=plholder
print nd
{'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']}

*非cpu效率,因为对于大数据集,append将非常慢。在

考虑使用不同的数据结构,例如集合字典。在

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

如果确实需要继续使用糟糕的数据结构,可以在完成后将其转换回:

^{pr2}$

相关问题 更多 >