Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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/2/jsf-2/2.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 3.x 仅从字典字典中获取空的子字典值_Python 3.x - Fatal编程技术网

Python 3.x 仅从字典字典中获取空的子字典值

Python 3.x 仅从字典字典中获取空的子字典值,python-3.x,Python 3.x,我研究这个问题已经有一段时间了,似乎无论我使用什么解决方案,我都得到了错误的答案 我有一本字典,例如 dict = {'a': {'name': 'Sam', 'likes': 'Cookies'}, 'b': {'name': 'Margaret', 'likes': None}, 'c': {'name': None, 'likes': None}} 我需要的是 {'b': {'likes': None}, 'c': {'name': None, 'lik

我研究这个问题已经有一段时间了,似乎无论我使用什么解决方案,我都得到了错误的答案

我有一本字典,例如

dict = {'a': {'name': 'Sam', 'likes': 'Cookies'},
        'b': {'name': 'Margaret', 'likes': None},
        'c': {'name': None, 'likes': None}}
我需要的是

{'b': {'likes': None},
 'c': {'name': None, 'likes': None}}
我试着用理解来保持它尽可能的通灵

>>>{subd:{key:value for key,value in dict[subd].items() if not value} for subd in dict}


{'a': {},
 'b': {'likes': None},
 'c': {'name': None, 'likes': None}}
我知道我在输出中得到“a”,因为我在迭代每个子字典,它的参数中有所有值,因此结果是空的{},如果子字典没有空值,我如何确保跳过子字典?

一些备注:

  • 请避免使用内置名称,例如
    dict
    。这些通常会导致破坏代码
  • 词典理解,只有在目的明确的情况下才是通灵的。使用嵌套字典理解,通常不会比两行分开的内容更容易阅读
在这种情况下,您只有两个深度级别,因此有两个循环就足够了,您只需检查最终字典是否不包含空键值:

data = {'a': {'name': 'Sam', 'likes': 'Cookies'},
        'b': {'name': 'Margaret', 'likes': None},
        'c': {'name': None, 'likes': None}}

def get_none(dictionary):
    result = {}
    for key, value in dictionary.items():
        result[key] = {k: v for k, v in value.items() if v is None}
    return {k: v for k, v in result.items() if v}

if __name__ == '__main__':
    print(get_none(data))
导致:

{'b': {'likes': None}, 'c': {'name': None, 'likes': None}}
编辑 我换了房间

dictionary = dictionary.copy()
一个名为
result
的新字典的行。通过这样做,我不会复制任何不必要的大型词典。

您可以使用以下代码:

dict = {'a':{'name': 'Sam', 'likes': 'Cookies'}, 'b':{'name': 'Margaret', 'likes': None}, 'c':{'name': None, 'likes': None}}
dic = {}
for elem in dict.keys():
    dict_n = dict[elem]
    di = {k: v for k, v in dict_n.items() if v is None}
    res = {elem:di}
    if di != {}:
        dic.__setitem__(elem,di)
print(dic)
输出:

{'b': {'likes': None}, 'c': {'name': None, 'likes': None}}

setitem方法向dict添加键值对

除了返回新的dict外,请不要修改给定的dict。这通常会导致破坏代码:-PI在构建解决方案时考虑过它,我应该提到,当然我忘记了。。。谢谢你的帮助。我通过创建本地副本来编辑代码,这样原始词典就不会被修改。
{k: nones
 for k, d in dct.items()
 if (nones := {k: v for k, v in d.items() if v is None})}