Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Python字典_Python_Dictionary - Fatal编程技术网

比较Python字典

比较Python字典,python,dictionary,Python,Dictionary,我写了两本字典。每个查询都基于同一数据库的不同查询。每个字典中都有一个键和数据库中的四个字段。我想找到在中的所有dict_x行都在dict_y中 for row in dict_x: if dict_y.values() not in dict_x.values(): del dict_x[row] print 'Length dict_x', len(dict_x) 这将返回错误 TypeError: 'type' object does not support

我写了两本字典。每个查询都基于同一数据库的不同查询。每个字典中都有一个键和数据库中的四个字段。我想找到在中的所有dict_x行都在dict_y中

 for row in dict_x:
    if dict_y.values() not in dict_x.values():
         del dict_x[row]

print 'Length dict_x', len(dict_x)
这将返回错误

TypeError: 'type' object does not support item deletion

解决这个问题的步骤是

  • 反转字典的键值对
  • 识别常见的相交关键点
  • 循环遍历键并检查它们的值是否匹配
  • 代码可能如下所示

    dict_x = {v: k for k, v in dict_x.items()}
    dict_y = {v: k for k, v in dict_y.items()}
    
    for key in dict_x.keys() & dict_y.keys():
       print(key, dict_x[key])
       print(key, dict_y[key])
    
    下面是python 3中的dict理解等价物

    result_set = {key: dict_x[key] for key in dict_x.keys() & dict_y.keys() if dict_x[key] == dict_y[key]}
    

    只要数组中的元素总是以相同的顺序排列,这就可以工作

    dict_x = {'hi': ['hello', 'hi'], 'bye': ['good bye', 'bye']}
    dict_y = {'hi': ['hello', 'hi']}
    dict_z = dict()
    
    for key, row in dict_x.items():
        if row in dict_y.values():
             dict_z[key] = row
    print(dict_z)
    
    如果元素顺序不同,则必须执行以下操作:

    dict_x = {'hi': ['hi', 'hello'], 'bye': ['good bye', 'bye']}
    dict_y = {'hi': ['hello', 'hi']}
    dict_z = dict()
    
    for x_key, x_row in dict_x.items():
        for y_key, y_row in dict_y.items():
            if set(x_row).intersection(y_row):
                dict_z[x_key] = y_row
    
    print(dict_z)
    

    这可能会有所帮助,如果dict相等,则返回False,否则返回true。我知道它的另一个方向

    def compare_dict(
        dict_1: Dict[Any, Any], dict_2: Dict[Any, Any]
    ):
        new_key = any([False if key in dict_1 else True for key in dict_2])
        delete_key = any(
            [False if key in dict_2 else True for key in dict_1]
        )
    
        if new_key or delete_key:
            return True
        else:
            values_mismatch_flag = any(
                [
                    True if v != dict_1[k] else False
                    for k, v in dict_2.items()
                ]
            )
            if values_mismatch_flag:
                return True
            return False
    

    你说的“排”是什么意思?字典没有行。它们有键和值。此外,您正在将
    dict_y.values()
    dict_x.values()
    进行比较。这是在每次迭代时比较整个字典的值-当然不是您想要的行我指的是字典项-我使用了单词row,因为字典是由SQL查询形成的。字典的大小在迭代过程中不会改变吗?或者我是否遗漏了什么?如果
    dict\x
    的键/行的值在
    dict_y
    然后要从
    dict_x
    中删除
    ?如果键不同,这会忽略吗?此答案有问题。如果列有重复的值怎么办?我认为这不起作用,因为根据我用来形成字典的查询,这些项应该有不同的键。我需要找出哪些项具有相同的值,而不管它们的键是什么。如果有一个项目的值在一个字典中不存在,我想删除它们。你的值是元组还是列表?如果你在同一个表中有一行重复的值怎么办?我只是想直接从字典中提取它们,所以我想答案是两者都不是?也许这是我错过的一步…你怎么拉他们?您可以在其中一行上键入(dict[row])以进行检查。
    def compare_dict(
        dict_1: Dict[Any, Any], dict_2: Dict[Any, Any]
    ):
        new_key = any([False if key in dict_1 else True for key in dict_2])
        delete_key = any(
            [False if key in dict_2 else True for key in dict_1]
        )
    
        if new_key or delete_key:
            return True
        else:
            values_mismatch_flag = any(
                [
                    True if v != dict_1[k] else False
                    for k, v in dict_2.items()
                ]
            )
            if values_mismatch_flag:
                return True
            return False