如何比较两个字典并提取其他值



我有1个字典和1个csv

d1

"Name","module","code","Message","MessageForRole"
"Country","Request","11101","Data Approved","Country User"
"Country","Request","11102","Data Granted","Country User"
"Country","Request","11103","Data Denied","Country User"
"Country","Request","11201","Data Request","Data Owner"
d2 = { "Name" : "Country",
"module": "Request",
"code" : 11101}

我的传入字典是d2

Fromd2,如果d1的值相同,则

d1字典中提取code, MessageForRole, Message

My Expected output

{'Name': 'Country','Message': 'Data Approved', 'MessageForRole': 'Country User' }

我的代码不工作

res = {}
for conf in range(0, len(d1)):
if int(d1["code"]) == int(d2['code']) and 
d1["applicationName"] == d2['applicationName'] and 
d1["moduleName"] == d2['moduleName']:
res['Name'] = d1['Name']
res['Message'] = d1['Message']
res['MessageForRole'] = d1['MessageForRole']


这里有一些代码应该可以做到这一点。它用CSV文件的内容初始化d1,用要匹配的键和值初始化d2(注意,我将d2中的代码更改为字符串)。

然后,对于d1中的每个dictd,将d2中的键和值与d中的键和值进行比较。如果所有键和值都匹配,则从d创建一个具有所需提取键的新字典。

import csv
EXTRACTION_KEYS = ('Name', 'Message', 'MessageForRole')
with open('input.csv', newline='') as f:
d1 = list(csv.DictReader(f))
d2 = { "Name" : "Country", "module": "Request", "code" : "11101"}    #N.B. code is now a string
for d in d1:
if all(d.get(k) == v for k,v in d2.items()):
print({k: d.get(k) for k in EXTRACTION_KEYS})

假设input.csv包含您的问题中提供的数据,输出将是:

{'Name': 'Country', 'Message': 'Data Approved', 'MessageForRole': 'Country User'}

如果你想收集所有与d2匹配的字典到一个列表中,这个列表推导应该做到这一点:

>>> [{k: d.get(k) for k in EXTRACTION_KEYS} for d in d1 if all(d.get(k) == v for k,v in d2.items())]
[{'Name': 'Country', 'Message': 'Data Approved', 'MessageForRole': 'Country User'}]

CSV (data.csv):

Name,module,code,Message,MessageForRole
Country,Request,11101,Data Approved,Country User
Country,Request,11102,Data Granted,Country User
Country,Request,11103,Data Denied,Country User
Country,Request,11201,Data Request,Data Owner

我认为这就是你想要做的:

  1. 读取csv文件并创建它的字典(注意可以通过多种方式实现)
  2. 使用这个data_dictionary执行匹配

从csv创建数据字典,想法获取头并相应地创建字典

def create_data_dict(data_lines):
data_dicts = list()
for idx, line in enumerate(data_lines):
if idx == 0:
headers = line.split(",")
else:
data_line = line.split(",")
temp_dict = {}
for header, data_val in zip(headers, data_line):
temp_dict[header] = data_val
data_dicts.append(temp_dict)
return data_dicts

读取文件并执行匹配

f_reader = open("data.csv", "r")
d2 = {"Name": "Country", "module": "Request", "code": 11101}
data_lines = f_reader.readlines()
data_dicts = create_data_dict(data_lines)
f_reader.close()
for item in data_dicts:
if int(d2["code"] == int(item["code"])):
print("Message -- ", item["Message"])
print("Name -- ", item["Name"])
# Do something else
输出:

Message -- Data Approved
Name -- Country

假设您有以下数据:

d1 = [ { 'Name': 'Country', 'module': 'Request', 'code': '11101', 'Message': 'Data Approved', 'MessageForRole': 'Country User' }, { 'Name': 'Country', 'module': 'Request', 'code': '11102', 'Message': 'Data Granted', 'MessageForRole': 'Country User' }, { 'Name': 'Country', 'module': 'Request', 'code': '11103', 'Message': 'Data Denied', 'MessageForRole': 'Country User' }, { 'Name': 'Country', 'module': 'Request', 'code': '11201', 'Message': 'Data Request', 'MessageForRole': 'Data Owner' } ]
d2 = { "Name" : "Country", "module": "Request", "code" : 11101}

我已经创建了下一个代码。首先,我定义了一个辅助函数:

#What this function does is check if one dictionary has the same values of d2. Take in consideration that d1 must be a single dictionary, not a list of  dictionary as you have defined.
def check(d1, d2):
for e in d2:
if type(d2[e])==int:
if d2[e]!=int(d1[e]):
return False

else:
if d2[e]!=d1[e]:
return False

return True

定义了这个函数之后,让我们对d1中的所有字典进行迭代。为此,并返回新字典,我创建了下一个函数:

output_keys=["Name", "MessageForRole", "Message" ] # We also define which output values we want
def new_dict(d1,d2):
doutput={}
for d in d1:     
if check(d,d2)==True: #Here we use the function defined before to check if both dictionary have the same values
for e in output_keys:
doutput[e]=d[e]

return(doutput)

因此,如果我们调用最终函数并定义d1和d2,我们将得到下一个输出:

new_dict(d1,d2)
{'Name': 'Country',
'MessageForRole': 'Country User',
'Message': 'Data Approved'}

此程序将始终返回d1的第一个字典的值这符合条件。

相关内容

最新更新