保持简单
如果我们知道所有的值都是字典,并且不希望检查它们的任何值是否也是字典,那么它就像下面这样简单:
len(dict_test) + sum(len(v) for v in dict_test.itervalues())
细化它一点,实际上在计数前检查值是否是字典:
len(dict_test) + sum(len(v) for v in dict_test.itervalues() if isinstance(v, dict))
最后,如果你想做一个任意深度,像下面的东西:
def sum_keys(d):
return (0 if not isinstance(d, dict)
else len(d) + sum(sum_keys(v) for v in d.itervalues())
print sum_keys({'key2': {'key_in3': 'value', 'key_in4': 'value'},
'key1': {'key_in2': 'value',
'key_in1': dict(a=2)}})
# => 7
在后一种情况下,我们定义一个将被递归调用的函数。给定值d,我们返回:
> 0如果该值不是字典;要么
>字典中的键数量,加上我们所有子代码中键的总数。
使它更快
以上是一个简洁和容易理解的方法。我们可以使用发电机得到一点快:
def _counter(d):
# how many keys do we have?
yield len(d)
# stream the key counts of our children
for v in d.itervalues():
if isinstance(v, dict):
for x in _counter(v):
yield x
def count_faster(d):
return sum(_counter(d))
这让我们更多的性能:
In [1]: %timeit sum_keys(dict_test)
100000 loops, best of 3: 4.12 s per loop
In [2]: %timeit count_faster(dict_test)
100000 loops, best of 3: 3.29 s per loop
|