python - 比较两个字典列表并将一个值附加到另一个列表

标签 python python-3.x

我有两个字典列表。我必须比较 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/

相关文章:

python - 在Python中表示稀疏矩阵而不使用库

python - 如何将 ElementTree 保存为 UTF-16

python - 无法使用请求从网站获取一些数字

python - 以数据帧格式打印列表

python - 我需要为 subprocess.call 命令提供变量名称

Python:如何从 n 个输入创建 n 个新列表?

python - 如何根据公差更改cv::Mat值

python - 如何在 Python 中以不同方式处理文件的第一行?

python - 将两个 pandas DataFrame 与一个唯一的列组合起来,并保留行索引 (Python)

python - Tkinter radiobutton IntVar 属性错误