如何获取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
将以几乎不可预测的顺序生成键值对,因此您不能保证这将为相同的输入生成相同的(甚至合理的)输出。它似乎在这里起作用,因为非负整数键恰好按照它们到达的顺序散列到典型的pythondict
。。。至少在某些版本的Python中是这样。使用负整数键({-1:2,-3:4,-5:[{-6:7,-8:9},{-10:11}]}
)的相同输入dict
)会产生大多数其他键类型所期望的混乱:[9,7,11,4,2]
。如果循环排序(d)
而不是d.items()
,则键将以可预测的顺序到达。。。也许不是OP想要的顺序,但至少是可以预测的。