【问题标题】:Comparing Python Dictionaries比较 Python 字典
【发布时间】:2019-06-15 03:16:16
【问题描述】:

我创建了两个字典。每个都基于同一数据库的不同查询。每个字典中有一个来自数据库的键和四个字段。我想找到 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_y.values()dict_x.values() 进行比较。这是在每次迭代中比较整个字典的值 - 肯定不是你想要的
  • “行”是指字典项——我使用“行”这个词是因为字典是由 SQL 查询形成的。
  • 这里的迭代过程中字典大小不会改变还是我遗漏了什么
  • 因此,如果dict_x 的键/行的值在dict_y 中,那么您想从dict_x 中删除key

标签: python dictionary


【解决方案1】:

只要数组中的元素始终保持相同的顺序,这将起作用。

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)

【讨论】:

    【解决方案2】:
    >>> dict_a = {'a':[1,1,2,3]}
    >>> dict_b = {'b':[1,2]}
    >>> for a_key, b_key in zip(dict_a.keys(), dict_b.keys()):
    ...     print [i for i in dict_a[a_key] if i in set(dict_b[b_key])]
    ... 
    [1, 1, 2]
    

    【讨论】:

    • 如果键不同,这会忽略吗?
    • 这个答案有问题。如果列有重复值怎么办?
    【解决方案3】:

    解决问题的步骤是

    1. 反转字典的键值对
    2. 识别常见的相交键
    3. 遍历键并检查它们的值是否匹配

    代码可能如下所示

    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 中的字典理解等价物

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

    【讨论】:

    • 我不认为这会起作用,因为根据我用来形成字典的查询,这些项目应该有不同的键。我需要找出哪些项目具有相同的值,而不管它们的键是什么。如果有一个项目的价值在一本字典中不存在,我想删除它们。
    • 你的值是元组还是列表?
    • 如果同一表中有一行重复的值怎么办?
    • 我只是想直接从字典中提取它们,所以我认为答案是否定的?也许这是我缺少的一步......
    • 你是怎么拉他们的?你可以在其中一行上做一个 type(dict[row]) 来检查它。
    【解决方案4】:

    这可能会有所帮助,如果 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多