如何总结以下列表?

时间:2013-01-31 10:36:36

标签: python list

我有一个这样的清单:

a = ['1 MB', '2 MB']

我想总结一下的所有元素。

我想我首先要创建整数列表并使用sum()函数。我怎么能这样做?

4 个答案:

答案 0 :(得分:2)

使用内置split将数字与字符串的其余部分

分开
>>> a = ['1 MB', '2 MB']
>>> sum([int(s.split(' ')[0]) for s in a])
3

s.split(' ')创建列表['1', 'MB']

或者使用生成器表达式来避免列表理解创建的不需要的列表:

>>> a = ['1 MB', '2 MB']
>>> sum(int(s.split(' ')[0]) for s in a)
3

答案 1 :(得分:1)

假设所有元素都以' MB'结尾,您可以这样做:

sum(map(int, (x[:-3] for x in a)))

故障:

  • (x[:-3] for x in a)除字符串的最后三个字符外,其他所有字符。
  • map(int, iterable)'将int函数'映射到可迭代的每个元素。
  • sum(iterable)简单地总结了iterable的元素。

答案 2 :(得分:0)

您可以在此处使用regex

In [19]: a = ['1 MB', '2 MB']

In [20]: sum(int(re.search(r'\d+',x).group()) for x in a)
Out[20]: 3

其中re.search(r'\d+')返回类似于:

的内容
In [23]: [re.search(r'\d+',x).group() for x in a]
Out[23]: ['1', '2']

答案 3 :(得分:0)

这适用于不同的乘数:

import re
pattern = "(\d+)\s*(\w+)?"

a = ['1 MB', '2 MB', '3 K', '250' ]

multiplier = { None: 1, 'MB' : 1000000, 'K' : 1000 }

def multi(m):
    if m:
        return int(m.group(1)) * multiplier[m.group(2)]
    else:
        return 0

r = map(multi, [ re.search(pattern, x) for x in a])
print r

print sum(r)

使用以下输出:

[1000000, 2000000, 3000, 250]
3003250