如何在字典的字典中找到列表长度之和?

9

In have a data set in the following format:

dataset = {
  "one" : { "a" : [ 0, 1, 2 ], "b" : [ 0,10,20 ] },
  "two" : { "a" : [ 0, 1 ], "b" : [ 0 ] }
}

我正在寻找一种快速的方法来计算所有“a”列表(以及“b”列表)的长度之和。
因此,对于上面的数据集,我希望总和为5(因为“one”[a]有3个成员,“two”[a]有2个成员,3+2通常是5)。
我认为像下面这样的代码可以完成任务,但我得到了意外的结果(错误的数字):
print sum( len(e) for d in dataset for e in dataset[d]["a"] )

我原以为这会依次获取“one”和“two”,对于每个字符串,它都会查找“a”的长度。然后计算所有找到的长度的总和。但实际上它并没有做到这一点,我应该使用什么方法呢?

3个回答

11

你只关心每个级别的值,所以只需遍历这些值:

>>> dataset = {
  "one": {"a": [0, 1, 2], "b": [0, 10, 20]},
  "two": {"a": [0, 1], "b": [0]}
}
>>> sum(len(lst) for dct in dataset.values() for lst in dct.values())
9

针对嵌套字典中的特定键:

>>> key = 'a'
>>> sum(len(dct[key]) for dct in dataset.values())
5

或者获取多个键的计数:

>>> {key: sum(len(dct[key]) for dct in dataset.values()) for key in 'ab'}
{'a': 5, 'b': 4}

3
您可以使用以下生成器表达式:

您可以使用类似于以下样式的生成器表达式:

>>> sum(len(v['a']) for k, v in dataset.items())
5

0
a,b = map(sum,zip(*((len(d["a"]),len(d["b"])) for d in dataset.values())))

print(a,b)
5 4

在Python2中使用itertools:

from itertools import imap,izip
a , b = imap(sum, izip(*((len(d["a"]),len(d["b"])) for d in dataset.itervalues())))

print(a,b)
5 4

如果可能存在不存在的键,则使用dict.get:

a, b = imap(sum, izip(*((len(d.get("a", [])), len(d.get("b",[]))) for d in dataset.itervalues())))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接