我有一个快译通,
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)
可能不必经过每个时间和数字追加到列表的更快解决?
谢谢!
Answer 1:
下面是一个使用字典解析一个相当直接的方式:
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}
Answer 2:
在这种情况下,由于数字都是在列表中的第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}
Answer 3:
如果你想作为一个列表的输出,使用列表理解:
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的字典不久,它的重新排列物品,因此输出这样的列表理解会给你正确的金额,但你不知道该款项对应于哪个字典项。
这就是为什么FJ的字典解析建议在这里似乎是最好的选择。
除非你看到它是可行的与列表理解不知何故?
Answer 4:
如果你的字典里有浮点值,那么上面的代码将无法正常工作,你会得到输出为0值。
所以,为了处理整数和浮点数,您可以使用下面的代码。
在理解的方式,
sums = {k: sum(i for i in v if not isinstance(i, str)) for k, v in d.items()}
要么
您可以使用常见的功能来检查给定的输入是否是数字或不那么我们可以总结的值,
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}
文章来源: Python how to get sum of numbers in a list that has strings in it as well