次のようなリストがあります。
a = ['1 MB', '2 MB']
a のすべての要素を合計したい。
最初に整数リストを作成し、sum() 関数を使用する必要があると考えました。どうやってやるの?
ビルトインを使用し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
すべての要素が で終わると仮定すると' MB'
、次のことができます。
sum(map(int, (x[:-3] for x in a)))
壊す:
(x[:-3] for x in a)
文字列の最後の 3 文字を除くすべてを取ります。map(int, iterable)
int
関数を iterable の各要素に「マップ」します。sum(iterable)
iterable の要素を単純に合計します。これは、異なる乗数に対して機能します。
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
ここで使用でき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']