我有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
我认为这就是你想要做的:
- 读取csv文件并创建它的字典(注意可以通过多种方式实现)
- 使用这个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的第一个字典的值这符合条件。