Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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中复杂字典中存在的所有值_Python_Dictionary - Fatal编程技术网

如何获取Python中复杂字典中存在的所有值

如何获取Python中复杂字典中存在的所有值,python,dictionary,Python,Dictionary,假设我们有多个不同格式的复杂字典,有没有办法自动提取所有值 例如: a = {1:2,3:4,4:{1:5}} a.values() [2,4,{1:5}] 但我想要的是: [2,4,5] 我如何管理以下词典的案例: b = {1:2,3:4,5:[{6:7,8:9},{10:11}]} 要输出: [2,4,7,9,11] 使用isinstance功能检查项目的类型 >>> def extract(d): for i,j in d.items():

假设我们有多个不同格式的复杂字典,有没有办法自动提取所有值

例如:

a = {1:2,3:4,4:{1:5}}
a.values()
[2,4,{1:5}]
但我想要的是:

[2,4,5]
我如何管理以下词典的案例:

b = {1:2,3:4,5:[{6:7,8:9},{10:11}]}
要输出:

[2,4,7,9,11]

使用
isinstance
功能检查项目的类型

>>> def extract(d):
    for i,j in d.items():
        if isinstance(j, dict):
            for x in j.values():
                yield x
        else:
            yield j


>>> list(extract({1:2,3:4,4:{1:5}}))
[2, 4, 5]
更新:

>>> def extract(d):
    for i,j in d.items():
        if isinstance(j, dict):
            for x in extract(j):
                yield x
        else:
            yield j


>>> list(extract({1:2,3:4,4:{1:{5:6}}}))
[2, 4, 6]
最后更新:

>>> def extract(d):
    for i,j in d.items():
        if isinstance(j, dict):
            for x in extract(j):
                yield x
        elif isinstance(j, list):
            for k in j:
                if isinstance(k, dict):
                    for l in extract(k):
                        yield l
        else:
            yield j


>>> list(extract({1:2,3:4,5:[{6:7,8:9},{10:11}]}))
[2, 4, 9, 7, 11]

字典没有固有的顺序,因此任何解决方案都必须1)将其输入限制为包含可排序键的字典,或2)不关心给定输入的多个同等有效的输出。在您的示例中,键都是可排序的。。。这是您可以安全地假设的吗?
d.items
将以几乎不可预测的顺序生成键值对,因此您不能保证这将为相同的输入生成相同的(甚至合理的)输出。它似乎在这里起作用,因为非负整数键恰好按照它们到达的顺序散列到典型的python
dict
。。。至少在某些版本的Python中是这样。使用负整数键(
{-1:2,-3:4,-5:[{-6:7,-8:9},{-10:11}]}
)的相同输入
dict
)会产生大多数其他键类型所期望的混乱:
[9,7,11,4,2]
。如果循环
排序(d)
而不是
d.items()
,则键将以可预测的顺序到达。。。也许不是OP想要的顺序,但至少是可以预测的。