我对Python还是很陌生,并且我在使用嵌套字典。考虑一下这个字典词典:
d = {
'a1': {
'a2': [
[1, 2, 3],
{
'a3': ({
'a4': 'cv'
}, (1, 2, 3, {
'a5': 'c'
}))
}
]
},
'b1': {
'b2': [1, 2, 3]
},
3: '3',
(1, 2, 3): 'immutable'
}
如何计算字典d
中的子字典。
我的算法不正确:
def count_dict(d):
# print(d.items())
return sum(1 + count_dict(v) if isinstance(v, dict) else 1 for _, v in d.items())
$> print(count_dict(d))
$> 6
,预期结果为9。
答案 0 :(得分:1)
您可以通过递归找到所有字典。在此之前,我必须澄清以下几点:
d
中找到字典b
,对吗?dict
。如果要查找所有key-value pairs
,则有9个key-value pairs
。所以我有两个正确的版本,一个用于dict
,一个用于key-value
(只是一行差异):
def count_dict(d):
if isinstance(d, dict):
# count 1 if it is a dict
count = 1
# iterate values for dict
iterable = d.values()
else:
count = 0
iterable = d
for v in iterable:
if isinstance(v, dict) or isinstance(v, list) or isinstance(v, tuple) or isinstance(v, set):
# count recursively
count += count_dict(v)
return count
def count_dict_pairs(d):
if isinstance(d, dict):
# count key-value pairs if it is a dict
count = len(d)
iterable = d.values()
else:
count = 0
iterable = d
for v in iterable:
if isinstance(v, dict) or isinstance(v, list) or isinstance(v, tuple) or isinstance(v, set):
count += count_dict(v)
return count
def test():
d = {
'a1': {
'a2': [
[1, 2, 3],
{
'a3': ({
'a4': 'cv'
}, (1, 2, 3, {
'a5': 'c'
}))
}
]
},
'b1': {
'b2': [1, 2, 3]
},
3: '3',
(1, 2, 3): 'immutable'
}
print(count_dict(d)) # output 6
print(count_dict_pairs(d)) # output 9
希望它能对您有所帮助。