我有两个字典列表。我必须比较 trans 中的 CodeDesc 和 code_tbl 中的 code_desc,当匹配时,将 code_tbl 中的代码添加到 trans。
trans = [{'id': 12345, 'Name': 'John Smith', 'CodeDesc': 'XYZ'},
{'id': 67891, 'Name': 'Jane Smith', 'CodeDesc': 'ABC'}]
code_tbl = [{'code': 98, 'code_desc': 'XYZ'},
{'code': 76, 'code_desc': 'ABC'}]
我的意图是拥有这样的东西:
trans = [{'Id': 12345, 'Name': 'John Smith', 'CodeDesc': 'XYZ', 'Code': 98},
{'Id': 67891, 'Name': 'Jane Smith', 'CodeDesc': 'ABC', 'Code': 76}]
最终,根据条件,来自trans的数据将被写入到Excel文件的不同标签中。
这是我为此编写的代码,我收到错误“TypeError: String indices must be integers”
for t in trans:
#print(t['CodeDesc'])
for c in code_tbl:
#print([c['code_desc'])
if t['CodeDesc'] == c['code_desc']:
trans.append(c['code'])
我做错了什么,如何解决?当我打印 t['CodeDesc'] 和 c['code_desc'] 时,它正在打印所有代码描述。
如有任何帮助,我们将不胜感激。我是 python 的新手。使用 XLSWRITER 编写 Excel 文件。
最佳答案
当您应该更新匹配字典时,您正在追加到您正在迭代的列表。使用 dict.update
而不是 list.append
:
if t['CodeDesc'] == c['code_desc']:
t.update(Code=c['code'])
print (trans)
[{'Code': 98, 'CodeDesc': 'XYZ', 'Name': 'John Smith', 'id': 12345},
{'Code': 76, 'CodeDesc': 'ABC', 'Name': 'Jane Smith', 'id': 67891}]
或者,您可以通过一次传递生成字典映射,然后通过另一次传递进行更新。这应该是一个线性解决方案。
mapping = {c['code_desc'] : c['code'] for c in code_tbl}
for t in trans:
t.update(Code=mapping.get(t['CodeDesc']))
print (trans)
[{'Code': 98, 'CodeDesc': 'XYZ', 'Name': 'John Smith', 'id': 12345},
{'Code': 76, 'CodeDesc': 'ABC', 'Name': 'Jane Smith', 'id': 67891}]
最后,如果您有 pandas,我建议您使用 merge
来执行此操作。
import pandas as pd
v = (pd.DataFrame(trans)
.merge(pd.DataFrame(code_tbl), left_on='CodeDesc', right_on='code_desc')
.drop('code_desc', 1))
print (v.to_dict('r'))
[{'CodeDesc': 'XYZ', 'Name': 'John Smith', 'id': 12345, 'code': 98},
{'CodeDesc': 'ABC', 'Name': 'Jane Smith', 'id': 67891, 'code': 76}]
关于python - 比较两个字典列表并将一个值附加到另一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52249777/