如何从字典数组创建一组字典键

GAP*_*002 1 python python-3.x

我有一个像这样的字典:

{
    "x": {
        "a": 1,
        "b": 2,
        "c": 3
    },
    "y": {
        "a": 1,
        "b": 2,
        "d": 4
    }
}
Run Code Online (Sandbox Code Playgroud)

每个键的值都是一个字典。我想创建set这些字典的所有键,就像上面的例子一样:

{"a", "b", "c", "d"}
Run Code Online (Sandbox Code Playgroud)

我在这方面花了很长时间,但总是出现错误:TypeError: unhashable type: 'dict_keys'。

我现在的代码是:

set(item.keys() for item in [dictonary for dictonary in self.data.values()])
Run Code Online (Sandbox Code Playgroud)

理想情况下,我不想使用任何模块,但如果需要的话我会。

Sha*_*ger 5

您可以进行以下两个微小更改之一,以使您编写的内容发挥作用:

  1. 联合keys对象(并删除无意义的无操作内部列表):

    set().union(*[dictionary.keys() for dictionary in self.data.values()])
    # Or somewhat less obviously, but more efficiently, you can just union 
    # the dicts themselves, which already act as collections of their keys:
    set().union(*self.data.values())
    
    Run Code Online (Sandbox Code Playgroud)

    这会生成一个空集,然后将所有键视图(或 sdict本身)解压为位置参数以与其联合;set.union采用可变参数,因此您可以将任意数量的集合传递给它以立即联合在一起。

  2. 在单个理解中正确使用嵌套循环,而不是嵌套在另一个理解中的理解(这不会按照您可能期望的方式解压):

    set(item for dictionary in self.data.values() for item in dictionary)
    # Or slightly better, but not as close to what you wrote, a true set comprehension
    {item for dictionary in self.data.values() for item in dictionary}
    
    Run Code Online (Sandbox Code Playgroud)

    注意循环的顺序是不同的;这种多循环理解中最左边的循环是外循环,当你向右移动时,移动到内循环。