比较两个字典项目的值

时间:2019-02-19 07:07:08

标签: python python-2.7 dictionary

我需要在两个不同的字典中比较项目的值。 假设字典RawData包含代表电话号码和号码名称的项目。

例如,Rawdata具有以下项:{'name': 'Customer Service', 'number': '123987546'} {'name': 'Switchboard', 'number': '48621364'}

现在,我得到了字典FilteredData,该字典已经包含RawData中的一些项目:{'name': 'IT-support', 'number': '32136994'} {'name': 'Company Customer Service', 'number': '123987546'}

如您所见,客户服务和公司客户服务都具有相同的值,但是键不同。在我的项目中,可能有数百个相似的重复项,我们只希望唯一的数字以FilteredData结尾。

FilteredData是我们稍后在代码中使用的,而RawData将被丢弃。

他们的名字(键)可以是重复的,但不能重复数字(值)**

有两种方法可以做到这一点。

A 。删除RawData中的重复项,之前,将其附加到FilteredData中。

B 。将它们附加到FilteredData中,并在那里浏览数字(值),删除重复项。我可以在这里使用一套吗?显然,它将在列表上起作用。

我不是在寻找最省时的解决方案。我希望有一种最简单易学的方法,如果有一天某人接任我的工作。在我的项目中,下一个编写代码的人必须快速掌握它。

我已经看过集合,并试图通过嵌套两个for循环来解决这个问题,但是有一些事情告诉我,有一种更简单的方法。

当然我可能会错过这里显而易见的解决方案。

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以做的是拿一个dict.values(),创建其中的set来删除重复项,然后浏览旧字典,找到具有该值的第一个键,然后将其添加到新的键中。保留该集合,因为当您获得下一个dict条目时,请尝试将元素添加到该集合中,并查看集合的长度是否长于添加之前。如果是这样,则它是唯一的元素,您可以将其添加到字典中。

答案 1 :(得分:1)

希望我在这里理解您的问题:

data = [{'name': 'Customer Service', 'number': '123987546'}, {'name': 'Switchboard', 'number': '48621364'}]
newdata = [{'name': 'IT-support', 'number': '32136994'}, {'name': 'Company Customer Service', 'number': '123987546'}]

def main():
    numbers = set()
    for entry in data:
        numbers.add(entry['number'])
    for entry in newdata:
        if entry['number'] not in numbers:
            data.append(entry)
    print data

main()

输出:

[{'name': 'Customer Service', 'number': '123987546'},
 {'name': 'Switchboard', 'number': '48621364'},
 {'name': 'IT-support', 'number': '32136994'}]

答案 2 :(得分:1)

如果您愿意更改当前 FilteredData 的方式,则可以只使用dict并使用number作为密钥:

RawData = [
  {'name': 'Customer Service', 'number': '123987546'},
  {'name': 'Switchboard', 'number': '48621364'}
]

# Change how FilteredData is structured
FilteredDataMap = {
  '32136994': 
  {'name': 'IT-support', 'number': '32136994'},
  '123987546':
  {'name': 'Company Customer Service', 'number': '123987546'}
}

for item in RawData:
  number = item.get('number')
  if number not in FilteredDataMap:
    FilteredDataMap[number] = item

# If you need the list of items
FilteredData = list(FilteredDataMap.values())

您可以使用.values()

从地图中提取实际列表

答案 3 :(得分:1)

我认为数字是唯一的。然后,另一种解决方案将利用字典键的唯一性。这意味着将字典的每个列表转换为“数字:名称”对的字典。然后,您只需要使用FilteredData更新RawData。

RawData = [
  {'name': 'Customer Service', 'number': '123987546'},
  {'name': 'Switchboard', 'number': '48621364'}
]

FilteredData = [
  {'name': 'IT-support', 'number': '32136994'},
  {'name': 'Company Customer Service', 'number': '123987546'}
]

def convert_list(input_list):
    return {item['number']:item['name'] for item in input_list}

def unconvert_dict(input_dict):
    return [{'name':val, 'number': key} for key, val in input_dict.items()]

NewRawData = convert_list(RawData)
NewFilteredData = conver_list(FilteredData)

DesiredResultConverted = NewRawData.update(NewFilteredData)
DesuredResult = unconvert_dict(DesiredResultConverted)

在此示例中,变量将具有以下值:

NewRawData = {'123987546':'Customer Service', '48621364': 'Switchboard'}
NewFilteredData = {'32136994': 'IT-support', '123987546': 'Company Customer Service'}

当您使用NewFilteredData更新NewRawData时,Company Customer Service将覆盖Customer Service作为与键123987546关联的值。所以,

DesiredResultConverted = {'123987546':'Company Customer Service', '48621364': 'Switchboard', '32136994': 'IT-support'}

然后,如果您仍然喜欢原始格式,则可以“取消转换”。