比较两个特定字段的词典列表

2024-04-28 12:47:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两份包含字典的清单。我想比较一下这些词典中的某些字段。在

current_list = [{"name": "Bill","address": "Home", "age": 23, "accesstime":11:14:01}, 
            {"name": "Fred","address": "Home", "age": 26, "accesstime":11:57:43},
            {"name": "Nora","address": "Home", "age": 33, "accesstime":11:24:14}]

backup_list = [{"name": "Bill","address": "Home", "age": 23, "accesstime":13:34:24}, 
           {"name": "Fred","address": "Home", "age": 26, "accesstime":13:34:26},
           {"name": "Nora","address": "Home", "age": 33, "accesstime":13:35:14}]

列表/字典的顺序应该相同,我只想比较某些键、值对。比如姓名、地址、年龄和忽略访问时间,但我目前所掌握的比较了每一个密钥/对。所以我只想比较一下

^{pr2}$

等等。在

for x in current_list:
    for y in backup_list:
        for k, v in x.items():
            for kk, vv in y.items():
                if k == kk:
                    print("Match: {0}".format(kk))
                    break
                elif k != kk:
                    print("No match: {0}".format(kk))

电流输出

Match name with name
No Match address with name
Match address with address
No Match age with name
No Match age with address
Match age with age
No Match dateRegistered with name
No Match dateRegistered with address
No Match dateRegistered with age
Match dateRegistered with dateRegistered

首选输出

Match name with name
Match address with address
Match age with age

*由于需求变更,我的列表变成了Elementtree xml元素的列表*

所以不是上面的列表,而是

backup_list =  ["<Element 'New' at 0x0000000002698C28>, <Element 'Update' at 0x0000000002698CC8>, <Element 'New' at 0x0000000002698CC8>"]

其中ElementTree是一个包含以下内容的xml元素:

{"name": "Nora", "address": "Home", "age": 33, "dateRegistered": 20140812}"

因此,基于下面的答案,这似乎符合我目前的要求:

value_to_compare = ["name", "address", "age"]
for i, elem in enumerate(current_list):
    backup_dict = backup_list[i]
    if elem.tag == "New":
        for key in value_to_compare:
            try:
                print("Match {0} {1} == {2}:".format(key, backup_dict.attrib[key], elem.attrib[key]))
            except KeyError:
                print("key {} not found".format(key))
            except:
                raise
    else:
        continue

Tags: keynonameinhomeforageaddress
3条回答

我不知道我是否完全理解您的问题,但我认为下面的代码应该可以做到:

compare_arguments = ["name", "age", "address"]
for cl, bl in zip(current_list, backup_list):
    for ca in compare_arguments:
        if cl[ca] == bl[ca]:
            print("Match {0} with {0}".format(cl[ca]))
    print("-" * 10)

上面的代码是对两个列表进行压缩迭代。用另一个列表指定要比较的字段。在主循环中,迭代可比较字段并相应地打印它们。在

简单的比较一下-

for current in current_list:
    for backup in backup_list:
        for a in backup:
            for b in current:
                if a == b:
                    if a == "name" or a== "age" or a== "address" :
                        if backup[a] == current[b]:
                            print (backup[a])
                            print (current[b])

我不理解您的数据结构的合理性,但我认为这会起到作用:

value_to_compare = ["name", "address", "age"]

for i, elem in enumerate(current_list):
    backup_dict = backup_list[i]
    for key in value_to_compare:
        try:
            print("Match {}: {} with {}".format(key, elem[key], backup_dict[key]))
        except KeyError:
            print("key {} not found".format(key))
            # may be a raise here.
        except:
            raise

相关问题 更多 >