Python如何在包含字符串的列表中获取数字总和

时间:2012-08-14 00:06:37

标签: python list dictionary sum

我有一个词典,

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应该返回6b应该返回7,依此类推。

目前,我正在这样做。

for i in d:
    l2=[]
    for thing in d[i]:
        if type(thing) == int:
            l2.append(thing)
        print sum(l2)

可以更快地修复,而不是每次都要将数字附加到列表中吗?

谢谢!

4 个答案:

答案 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}