1

以下のようなタプルのリストがあります

[(0, 33), (3, 26), (4, 95), (0, 28), (1, 12), (2, 3), (4, 69)]

最初の要素が(1回以上)一致する場合、タプルの2番目の要素を乗算したい。そうでない場合は、タプルを無視します。したがって、出力は次のようになります。

33 * 28 + 95 * 69 = 7479

現在、私は次のことを行っています:

  1. カウンターを使用して、タプルの最初の要素の存在を確認します。
  2. コレクションを繰り返し処理して、要素が 1 つ以上のタプルが存在するかどうかを確認します。1要素のものを無視する
  3. 非 1 要素タプルを繰り返し辞書に追加し、乗算を更新します。
  4. 辞書のsum関数を使用するvalues

これを減らすためのpythonicな方法があるのだろうか。ここで問題を複雑にしていると確信しています。

4

4 に答える 4

0

この質問に対する良い答えがなかったことに驚いた...これが私の見解です:

test = [(0, 33), (3, 26), (4, 95), (0, 28), (1, 12), (2, 3), (4, 69)]
unique_keys = set([pair[0] for pair in test]) #{0, 1, 2, 3, 4}
grouped_by_key = [[el[1] for el in test if el[0] == key] for key in unique_keys] # [[33, 28], [12], [3], [26], [95, 69]]
grouped_by_key = filter(lambda x: len(x) > 1,grouped_by_key) # [[33, 28], [95, 69]]

add = lambda x, y : x+y
mul = lambda x, y : x*y
# Alternatively:
# from operator import add, mul

out = reduce(add, map(lambda x: reduce(mul, x), grouped_by_key))  #7479
于 2017-03-13T16:57:25.987 に答える