从字典中获取所有值(包括字典中字典中的值)



例如,如果有一个像下面这样的字典,我想要一个函数get_dict_values(),这样

dic = {1:"1", 2:"2", 3:{"a":"a", "b":"b"}, 4:"4"}
print(get_dict_values(dic))
>>> ["1","2","a","b","4"]
def getValues(CASE):
if isinstance(CASE, dict):
for VALUE in CASE.values():
yield from getValues(VALUE)
elif isinstance(CASE, list):
for VALUE in CASE:
yield from getValues(VALUE)
else:
yield CASE

if __name__ == '__main__':
TEST_CASE = {
1: "1",
2: "2",
3: {
"a": "a",
"b": "b"
},
4: "4"
}
print(list(getValues(TEST_CASE)))
b=[list(i.values())  if isinstance(i,dict) else i for i in dic.values()]
[i for elem in b for i in elem ]
['1', '2', 'a', 'b', '4']

解释:

dic.values()
dict_values(['1', '2', {'a': 'a', 'b': 'b'}, '4'])

从这里我们需要得到内部dictkeysvalues,这是不清楚的,但假设values是必需的,我们需要迭代dic.valuesif,这是dict,我需要内部dict的值,即'a','b',否则我只需要列表中的项目,即1,2,4。为此,我们可以使用listcomprehensionif & else

[`do this` if `foo` else `do that` for item in iterator ]  ==> if ,else ,for.

对于我们的if condition,我使用isinstance()来检查内部字典并获得内部dict的值。如果它不是一个dict,然后给我只项目。

isinstance(object, classinfo)
Return True if the object argument is an instance of the classinfo argument, or of a (direct, indirect or virtual) subclass thereof. If object is not an object of the given type, the function always returns False 
b=[list(i.values())  if isinstance(i,dict) else i for i in dic.values()]
['1', '2', ['a', 'b'], '4']

这里我们在变量b中得到嵌套列表。为了打破嵌套列表,我使用了另一个推导式。

[i for elem in b for i in elem ] == [item for sublist in b for item in sublist]

如果我们倒着读就容易理解了。

相关内容

  • 没有找到相关文章

最新更新