我有一个像这样的字典:
{
"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)
理想情况下,我不想使用任何模块,但如果需要的话我会。
您可以进行以下两个微小更改之一,以使您编写的内容发挥作用:
联合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采用可变参数,因此您可以将任意数量的集合传递给它以立即联合在一起。
在单个理解中正确使用嵌套循环,而不是嵌套在另一个理解中的理解(这不会按照您可能期望的方式解压):
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)
注意循环的顺序是不同的;这种多循环理解中最左边的循环是外循环,当你向右移动时,移动到内循环。
| 归档时间: |
|
| 查看次数: |
2501 次 |
| 最近记录: |