2013-01-31 42 views
0

我有一個這樣的名單:如何求和下面的列表?

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

我要總結的所有元素。

我想我首先要創建整數列表並使用sum()函數。我怎樣才能做到這一點?

回答

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 
+0

您可以用生成器替換列表理解 - 節省時間和內存,特別是對於大列表。 – Volatility

+0

@Volatility,謝謝指出。 – StoryTeller

1

假設所有元素都以結尾,你可以這樣做:

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

擊穿:

  • (x[:-3] for x in a)通吃,但字符串的最後三個字符。
  • map(int, iterable)'將'int函數映射到可迭代的每個元素。
  • sum(iterable)只是對可迭代元素進行求和。
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'] 
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