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

Python如何在一个包含字符串的列表中获取数字的总和,python,list,dictionary,sum,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应该返回6,b应该返回7,依此类推 目前,我正在这样做 for i in d: l2=[] for thing in d[i]: if type(thing) ==

我有一份口述

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)
有没有可能比每次都要检查并将数字添加到列表中更快的修复


谢谢

下面是一个使用字典理解的简单方法:

sums = {k: sum(i for i in v if isinstance(i, int)) 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']}

sums = [sum(i for i in v if isinstance(i, int)) for k, v in d.items()]

[6, 7, 7, 4, 7, 4, 4]
或在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}

在这种情况下,因为数字都在列表的第一和第三位置

>>> {k: sum(v[::2]) for k,v in d.items()}
{'a': 6, 'c': 7, 'b': 7, 'e': 4, 'd': 7, 'g': 4, 'f': 4}

如果要输出为列表,请使用列表:

sums = {k: sum(i for i in v if isinstance(i, int)) 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']}

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.的词典理解建议似乎是最好的选择


除非您认为它在某种程度上与列表理解是可行的?

如果您的字典具有浮点值,那么上述代码将不起作用,您将得到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}

注意,如果isinstance(thing,int)而不是type(),则应该使用
?只是为了提高效率?为什么列表中有混合类型?如果我只想返回数字呢。因此,不是返回的和的字典,而是输出的和。或者,给定一个字典列表,例如{'a':[4,'bill',2]),它应该返回6。如果字典中只有一个键,您可以使用
sum(i代表v in d.values()代表i in v,如果i是instance(i,int))
,但是如果有多个键,那么只返回这些键将给出如中所述的任意顺序。