首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中合并具有重复项的字典

在python中合并具有重复项的字典
EN

Stack Overflow用户
提问于 2017-02-05 11:29:12
回答 2查看 51关注 0票数 0

我正在尝试创建一个代码,将合并3个不同的字典(其他两个字典到第一个主字典)。在保留值的同时存在重复的键时。我目前被困在找到重复项的地方,并且在将它们添加到newDict或d1时遇到了麻烦。有没有人能帮我把每个副本变成某种对象,我可以把它添加到包含所有其他键的新字典中?谢谢。

代码语言:javascript
复制
d1 = {'Norton': '408-771-7231', 'Edward': '415-669-7234', 'Julia':'510-669-7723'}
# Phone number information / "newDict"
d2 = {'Norton': '12345 El Monte Road', 'James': '4236 Capitol Expressway', 'Mary': '6345 Mia Circle'}
# Address information
d3 = {'Norton': 'Male', 'James': 'Male', 'John': 'Male', 'Elizabeth': 'Female'}
# Gender Information
newDict = d1
# d1 will act as the main dictionary and retain all of it's entries and receive entries.

newDictKeys=newDict.keys()
d1Keys=d1.keys()
d2Keys=d2.keys()
d3Keys=d3.keys()

allKeys = [d2Keys, d3Keys]  # Left out d1Keys since it will retain it's entries.
print('Printing original dictionary entries...','\n','d1 =', d1, '\n', 'd2 =', d2, '\n', 'd3 =', d3, '\n')

print('Cross referencing keys from d1 with d2Keys and d3Keys...')

tempList = []

def addToDictForSameKey(comboDictionary, addOnDictionary, key):
    return None


for keysOfDictX in allKeys:
    for keyX in keysOfDictX:
        print('\nChecking key:', keyX)

        for keyY in newDict:
            print('With this key in newDict:', keyY)

            if keyX == keyY:  # check for identical keys
                addToDictForSameKey(newDict, d2, keyX)
                print('Found Duplicate', keyX, 'with', keyY, 'in', keysOfDictX)
                print('adding to newDict')
                break
            else:

                continue

print('\n', newDict)

输出:

代码语言:javascript
复制
Printing original dictionary entries... 
 d1 = {'Norton': '408-771-7231', 'Edward': '415-669-7234', 'Julia': '510-669-7723'} 
 d2 = {'Norton': '12345 El Monte Road', 'James': '4236 Capitol Expressway', 'Mary': '6345 Mia Circle'} 
 d3 = {'Norton': 'Male', 'James': 'Male', 'John': 'Male', 'Elizabeth': 'Female'} 

Cross referencing keys from d1 with d2Keys and d3Keys...

Checking key: Norton
With this key in newDict: Norton
Found Duplicate Norton with Norton in dict_keys(['Norton', 'James', 'Mary'])
adding to newDict

Checking key: James
With this key in newDict: Norton
With this key in newDict: Edward
With this key in newDict: Julia

Checking key: Mary
With this key in newDict: Norton
With this key in newDict: Edward
With this key in newDict: Julia

Checking key: Norton
With this key in newDict: Norton
Found Duplicate Norton with Norton in dict_keys(['Norton', 'James', 'John', 'Elizabeth'])
adding to newDict

Checking key: James
With this key in newDict: Norton
With this key in newDict: Edward
With this key in newDict: Julia

Checking key: John
With this key in newDict: Norton
With this key in newDict: Edward
With this key in newDict: Julia

Checking key: Elizabeth
With this key in newDict: Norton
With this key in newDict: Edward
With this key in newDict: Julia

 {'Norton': '408-771-7231', 'Edward': '415-669-7234', 'Julia': '510-669-7723'}

Process finished with exit code 0

我希望输出如下所示:

代码语言:javascript
复制
   {['Norton': '408-771-7231', '12345 El Monte Road', 'Male'] ['Edward': '415-669-7234'] ['Julia': '510-669-7723'] 
['James': '4325 Capitol Expressway', 'Male'] ['Mary': '6345 Mia Circle'] ['John': 'Male'] ['Elizabeth':'Female']}

基本上,所有内容(或者至少只有重复的条目)都在一个列表中,该列表位于单个print语句的字典内部。

EN

回答 2

Stack Overflow用户

发布于 2017-02-05 11:54:40

如果您可能有重复项,那么将它们都设置为属性的list可能会更好,这样您就不必在访问时使用条件。

但是,如果您想要复制的条件列表,那么只需构造复制的list

代码语言:javascript
复制
def addToDictForSameKey(comboDictionary, addOnDictionary, key):
    try:  # Already a list
        comboDictionary[key].append(addOnDictionary[key])
    except AttributeError:
        comboDictionary[key] = [comboDictionary[key], addOnDictionary[key]]

for d in (d2, d3):
    for k, v in d.items():
        if k in d1:
             addToDictForSameKey(d1, d, k):

将创建所有三个字典的超级字典,并将重复的关键字转换为属性的list

票数 0
EN

Stack Overflow用户

发布于 2017-02-05 15:51:48

我的解决方案是:

代码语言:javascript
复制
d0 = {}

for key in set(d1.keys() + d2.keys() + d3.keys()):
    try:
        d0.setdefault(key,[]).append(d1[key])
    except KeyError:
        pass

    try:
        d0.setdefault(key,[]).append(d2[key])
    except KeyError:
        pass

    try:
        d0.setdefault(key,[]).append(d3[key])
    except KeyError:
        pass

print (d0)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42048251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档