web-dev-qa-db-ja.com

タプルのリストの各値を合計する

次のようなタプルのリストがあります。

l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)]

次の結果が得られるシンプルなワンライナーを作成します。

r = (25, 20) or r = [25, 20] # don't care if Tuple or list.

次のようになります:

r = [0, 0]
for t in l:
  r[0]+=t[0]
  r[1]+=t[1]

これは非常に単純なものであると確信していますが、考えられません。

注:私はすでに同様の質問を見ました:

タプル内のリストのセットの最初の値を合計する方法は?

Pythonでタプルのリストの各タプルの最初の値を合計する方法は?

25
Inbar Rose

Zip()およびsum()を使用します。

In [1]: l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)]

In [2]: [sum(x) for x in Zip(*l)]
Out[2]: [25, 20]

または:

In [4]: map(sum, Zip(*l))
Out[4]: [25, 20]

timeitの結果:

In [16]: l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)]*1000

In [17]: %timeit [sum(x) for x in Zip(*l)]
1000 loops, best of 3: 1.46 ms per loop

In [18]: %timeit [sum(x) for x in izip(*l)]       #prefer itertools.izip
1000 loops, best of 3: 1.28 ms per loop

In [19]: %timeit map(sum, Zip(*l))
100 loops, best of 3: 1.48 ms per loop

In [20]: %timeit map(sum, izip(*l))                #prefer itertools.izip
1000 loops, best of 3: 1.29 ms per loop
54

私は与えられた答えに何かを追加したい:

Dictの配列がある場合、たとえば.

l = [{'quantity': 10, 'price': 5},{'quantity': 6, 'price': 15},{'quantity': 2, 'price': 3},{'quantity': 100, 'price': 2}]

そして、私は値の上で計算された量の2つ(またはそれ以上)の合計を取得したい数量と価格*数量の合計

できます:

(total_quantity, total_price) = (
sum(x) for x in Zip(*((item['quantity'],
                       item['price'] * item['quantity'])
                      for item in l)))

の代わりに:

total_quantity = 0
total_price = 0
for item in l:
     total_quantity += item['quantity']
     total_price += item['price'] * item['quantity']

おそらく最初の解決策は読みにくいですが、より「pythonesque」です:)

2

Zipを使用せずに

sum(e[0] for e in l), sum(e[1] for e in l)
1
cipilo