【问题标题】:How to get comman data from two list of dictionaries based on having comman values for a specific key in both list's dictionaries?如何根据两个列表字典中特定键的公共值从两个字典列表中获取公共数据?
【发布时间】:2022-08-02 17:24:35
【问题描述】:

第一个字典列表:

ldic_1 = [{\'personId\': \'2DHSJ32N2\'}, {\'personId\': \'8SHFJW7BA\'}, {\'personId\': \'2KS4BA0X9\'}, {\'personId\': \'2H84XKNH1\'}, {\'personId\': \'2H7QW2J4S\'}, {\'personId\': \'2HAY258CG\'}]

第二个字典列表:

ldic_2 = [{\'id\': \'2DHSJ32N2\', \'fname\': \'Adam\'}, {\'id\': \'8SHFJW7BA\', \'fname\': \'Smith\'}, {\'id\': \'2KS4BA0X9\', \'fname\': \'Lara\'}, {\'id\': \'2H8C3J8VD\', \'fname\': \'Kane\'}, {\'id\': \'2H84XKNH1\', \'fname\': \'Donald\'}, {\'id\': \'2H86CEQDG\', \'fname\': \'Nastya\'}, {\'id\': \'2H95F5D81\', \'fname\': \'Karolina\'}, {\'id\': \'2HA7GUKPQ\', \'fname\': \'Sara\'}, {\'id\': \'2H7TPXZSN\', \'fname\': \'Harry\'}, {\'id\': \'2HARDNGSW\', \'fname\': \'Joe\'}, {\'id\': \'2HAS95FR5\', \'fname\': \'Jill\'}, {\'id\': \'2HAY258CG\', \'fname\': \'David\'}]

每当 ldic_1 的 \"personId\" 的值与 ldic_2 的 \"id\" 的值匹配时,ldic_2 就会得到更新,预期结果将是:

ldic_2 = [{\'id\': \'2DHSJ32N2\'}, {\'id\': \'8SHFJW7BA\'}, {\'id\': \'2KS4BA0X9\'}, {\'id\': \'2H84XKNH1\'}, {\'id\': \'2H7QW2J4S\'}, {\'id\': \'2HAY258CG\'}]

我不知道该怎么做。请帮助和感谢。

  • 欢迎来到堆栈溢出。只需遍历第一个字典并检查personId 是否在ldic_2 中。如果它不在其中,请删除该项目。
  • @ewong 我是 Python 新手,所以请指定步骤。谢谢

标签: python list dictionary


【解决方案1】:

这将是解决此问题的有效方法(假设 id 是唯一的):

ldic_1 = [{'personId': '2DHSJ32N2'}, {'personId': '8SHFJW7BA'}, {'personId': '2KS4BA0X9'}, {'personId': '2H84XKNH1'},
          {'personId': '2H7QW2J4S'}, {'personId': '2HAY258CG'}]

ldic_2 = [{'id': '2DHSJ32N2', 'fname': 'Adam'}, {'id': '8SHFJW7BA', 'fname': 'Smith'},
          {'id': '2KS4BA0X9', 'fname': 'Lara'}, {'id': '2H8C3J8VD', 'fname': 'Kane'},
          {'id': '2H84XKNH1', 'fname': 'Donald'}, {'id': '2H86CEQDG', 'fname': 'Nastya'},
          {'id': '2H95F5D81', 'fname': 'Karolina'}, {'id': '2HA7GUKPQ', 'fname': 'Sara'},
          {'id': '2H7TPXZSN', 'fname': 'Harry'}, {'id': '2HARDNGSW', 'fname': 'Joe'},
          {'id': '2HAS95FR5', 'fname': 'Jill'}, {'id': '2HAY258CG', 'fname': 'David'}]

adict = {elem.pop('id'): elem for elem in ldic_2}

result = []
for elem in ldic_1:
    if elem['personId'] in adict:
        result.append({'id': elem['personId']})

# if you want one-liner:
# result = [{'id': elem['personId']} for elem in ldic_1 if elem['personId'] in adict]


print(result)

输出:

[{'id': '2DHSJ32N2'}, {'id': '8SHFJW7BA'}, {'id': '2KS4BA0X9'}, {'id': '2H84XKNH1'}, {'id': '2HAY258CG'}]

【讨论】:

  • 可以使用列表推导代替嵌套的 for 循环吗?
  • 是的,见评论,我在那里发布了一个班轮:result = [{'id': elem['personId']} for elem in ldic_1 if elem['personId'] in adict]
【解决方案2】:
set_of_ids = {dic['personId'] for dic in ldic_1} 
for dic in ldic_2:
    if dic['id'] in set_of_ids:
        del dic['fname']

输出 :

[{'id': '2DHSJ32N2'},
 {'id': '8SHFJW7BA'},
 {'id': '2KS4BA0X9'},
 {'id': '2H8C3J8VD', 'fname': 'Kane'},
 {'id': '2H84XKNH1'},
 {'id': '2H86CEQDG', 'fname': 'Nastya'},
 {'id': '2H95F5D81', 'fname': 'Karolina'},
 {'id': '2HA7GUKPQ', 'fname': 'Sara'},
 {'id': '2H7TPXZSN', 'fname': 'Harry'},
 {'id': '2HARDNGSW', 'fname': 'Joe'},
 {'id': '2HAS95FR5', 'fname': 'Jill'},
 {'id': '2HAY258CG'}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2023-01-26
    • 2021-09-17
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多