例如,如果有一个像下面这样的字典,我想要一个函数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'])
从这里我们需要得到内部dict
的keys
或values
,这是不清楚的,但假设values
是必需的,我们需要迭代dic.values
和if
,这是dict
,我需要内部dict
的值,即'a','b'
,否则我只需要列表中的项目,即1,2,4
。为此,我们可以使用listcomprehension
和if & 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]
如果我们倒着读就容易理解了。