【问题标题】:comparing two dictionaries with list type values将两个字典与列表类型值进行比较
【发布时间】:2011-07-01 00:50:54
【问题描述】:

我正在尝试比较两个字典。我的方法是将它们变成两个单独的元组列表,然后使用 set 模块。这是一个插图:

dict = {'red':[1,2,3],'blue':[2,3,4],'green':[3,4,5]}

dict1 = {'green':[3,4,5],'yellow':[2,3,4],'red':[5,2,6]}

intersection = set(set(dict.items()) & set(dict1.items()))

显然,这是比较两个元组列表,python 不喜欢这样。我得到一个 TypeError: 'list' is unhashable error(或类似的措辞)。

我希望交集包含[('green',[3,4,5])]。有什么想法吗?

【问题讨论】:

    标签: python list dictionary compare tuples


    【解决方案1】:
    shared_keyvals = dict( (key, dict1[key])
                           for key in (set(dict1) & set(dict2))
                           if dict1[key] == dict2[key]
                         )
    

    你甚至可以把它变成一个函数:

    def shared_keyvals(dict1, dict2):
        return dict( (key, dict1[key])
                     for key in (set(dict1) & set(dict2))
                     if dict1[key] == dict2[key]
                   )
    

    显然,如果您不想以字典形式输出,您可以删除 dict() 调用并替换为列表解析括号 ([])。

    【讨论】:

    • 天哪,我认为它奏效了。我整天都在摸索这个。谢谢一百万!
    • 我得到了一个错误。第 6 行:'dict' 对象不可调用 //
    • @john 你不需要将你的字典命名为dict
    【解决方案2】:

    列表是可变的,因此不可散列。一个集合只能由可散列项构建。由于上面两个 dicts 中的值是列表,因此不能用它们构建集合。但是,如果要将值的类型从列表更改为元组(不可变),则可以构建集合并执行集合操作。

    >>> dict1 = {'blue': (2, 3, 4), 'green': (3, 4, 5), 'red': (1, 2, 3)}
    >>> dict2 = {'green': (3, 4, 5), 'yellow': (2, 3, 4), 'red': (5, 2, 6)}
    >>> list(set(dict1.items()) & set(dict2.items()))
    [('green', (3, 4, 5))]
    

    【讨论】:

    • 谢谢阿德尔。看起来我没有指定它是一个列表。我的菜鸟错误......
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2023-03-26
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多