我有一个词典,
d = {'a': [4,'Adam', 2], 'b': [3,'John', 4], 'c': [4,'Adam', 3], 'd': [4,'Bill', 3], 'e': [4,'Bob'], 'f': [4, 'Joe'], 'g': [4, 'Bill']}
有没有快速的方法来获取字典中每个列表中的数字总和?
例如,a
应该返回6
,b
应该返回7
,依此类推。
目前,我正在这样做。
for i in d:
l2=[]
for thing in d[i]:
if type(thing) == int:
l2.append(thing)
print sum(l2)
可以更快地修复,而不是每次都要将数字附加到列表中吗?
谢谢!
答案 0 :(得分:8)
这是一种使用词典理解的相当直接的方式:
sums = {k: sum(i for i in v if isinstance(i, int)) for k, v in d.items()}
或者在Python 2.6及以下版本中:
sums = dict((k, sum(i for i in v if isinstance(i, int))) for k, v in d.items())
示例:
>>> {k: sum(i for i in v if isinstance(i, int)) for k, v in d.items()}
{'a': 6, 'c': 7, 'b': 7, 'e': 4, 'd': 7, 'g': 4, 'f': 4}
答案 1 :(得分:0)
在这种情况下,由于数字都在列表的第1和第3位置
>>> {k: sum(v[::2]) for k,v in d.items()}
{'a': 6, 'c': 7, 'b': 7, 'e': 4, 'd': 7, 'g': 4, 'f': 4}
答案 2 :(得分:0)
如果要输出列表,请使用列表推导:
d = {'a': [4,'Adam', 2], 'b': [3,'John', 4], 'c': [4,'Adam', 3], 'd': [4,'Bill',
3], 'e': [4,'Bob'], 'f': [4, 'Joe'], 'g': [4, 'Bill']}
sums = [sum(i for i in v if isinstance(i, int)) for k, v in d.items()]
[6, 7, 7, 4, 7, 4, 4]
正如您所看到的,这并不完全匹配。手动添加d中的项目
[6, 7, 7, 7, 4, 4, 4]
那么为什么不匹配?
这是因为字典未排序
只要将d创建为字典,它就会重新排列其项目,因此输出这样的列表理解将为您提供正确的总和,但您不知道哪个总和对应于哪个字典项目。
这就是为什么F.J.的词典理解建议似乎是最好的选择。
除非你看到它以某种方式对列表理解起作用吗?
答案 3 :(得分:0)
如果您的字典具有浮点值,那么上面的代码将不起作用,您将获得输出为0值。
因此,对于处理整数和浮点数,您可以使用下面的代码。
以理解的方式,
sums = {k: sum(i for i in v if not isinstance(i, str)) for k, v in d.items()}
OR
您可以使用常用功能检查给定输入是否为数字,然后我们可以对值进行求和,
d = {'a': [4,'Adam', 2], 'b': [3,'John', 4], 'c': [4,'Adam', 3], 'd': [4,'Bill', 3], 'e': [4,'Bob'], 'f': [4, 'Joe'], 'g': [4, 'Bill']}
def get_num(str):
"""
This function converts the number/number string into a float. Otherwise, returns 0
"""
try:
return float(str)
except:
return 0.0
if __name__ == '__main__':
# example list which contains numbers and strings
sums = {k:sum(get_num(value) for value in v) for k, v in d.items()}
print sums
## output for the given input dict d
## {'a': 6.0, 'c': 7.0, 'b': 7.0, 'e': 4.0, 'd': 7.0, 'g': 4.0, 'f': 4.0}