0

我有一个这样的列表:

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

我想总结 a 中的所有元素。

我想我首先必须创建整数列表并使用 sum() 函数。我怎样才能做到这一点?

4

4 回答 4

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
于 2013-01-31T10:38:57.507 回答
1

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

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

分解:

  • (x[:-3] for x in a)获取字符串的最后三个字符以外的所有字符。
  • map(int, iterable)将函数“映射”int到可迭代的每个元素。
  • sum(iterable)简单地将可迭代的元素相加。
于 2013-01-31T10:39:31.767 回答
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

wherere.search(r'\d+')返回类似:

In [23]: [re.search(r'\d+',x).group() for x in a]
Out[23]: ['1', '2']
于 2013-01-31T10:41:28.227 回答
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
于 2013-01-31T11:31:27.383 回答