如何在字典的字典中找到列表的长度总和?
How to find the sum of the lengths of a list in a dictionary of dictionaries?
具有以下格式的数据集:
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" 的长度。然后它将计算找到的所有长度的总和。没有,我应该用什么?
您只对每个级别的值感兴趣,因此只需迭代这些值即可:
>>> 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}
您可以像这样使用生成器表达式:
>>> sum(len(v['a']) for k, v in dataset.items())
5
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())))
具有以下格式的数据集:
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" 的长度。然后它将计算找到的所有长度的总和。没有,我应该用什么?
您只对每个级别的值感兴趣,因此只需迭代这些值即可:
>>> 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}
您可以像这样使用生成器表达式:
>>> sum(len(v['a']) for k, v in dataset.items())
5
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())))