1

我有一个字典,

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

4 回答 4

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}
于 2012-08-14T00:14:46.527 回答
0

如果您的字典具有浮点值,那么上面的代码将不起作用,您将得到输出为 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}
于 2014-01-07T08:12:00.520 回答
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 创建为字典,它就会重新排列其项目,因此输出这样的列表理解将为您提供正确的总和,但您不知道哪个总和对应于哪个字典项目。

这就是为什么 FJ 的字典理解建议似乎是这里的最佳选择。

除非您发现它可以以某种方式与列表理解一起使用?

于 2012-08-14T01:30:44.567 回答
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}
于 2012-08-14T00:19:17.557 回答