0

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

[(1,4),(3,5),(2,9),(6,23),(3,21),(2,66),(5,20),(1,33),(3,55),(1,8)]

今、私はこのようなものが必要です

  1. 上記のリストでは、各要素はタプルで、タプルの最初の項目はインデックスで、2 番目の項目は値です。
  2. インデックスが等しいすべてのタプル値を乗算し、すべてのインデックスのすべての乗算結果を加算する必要があります。
  3. 特定のインデックスを持つタプルが 1 つしかない場合、その乗算結果をゼロにする必要があります。つまり、タプルは最終的な合計に寄与しません。

誰かが私を助けることができれば、私はとても義務付けられます. 私はPythonが初めてなので、難しいと思います。

4

7 に答える 7

3

これを行う1つの方法を次に示します。itertools.groupby各インデックスに対応するグループを作成し、乗算および加算するために使用します

from operator import itemgetter, mul
from itertools import groupby
z = [(1,4),(3,5),(2,9),(6,23),(3,21),(2,66),(5,20),(1,33),(3,55),(1,8)]
z = sorted(z, key=itemgetter(0))
z = groupby(z, key=itemgetter(0))
z = ((key, list(value for (key, value) in groups)) for (key, groups) in z)
z = ((key, reduce(mul, values, 1)) for (key, values) in z if len(values) > 1)
z = sum(value for (key, value) in z)
print z
7425
于 2013-05-29T16:37:39.093 に答える
0

辞書を使用した回答は次のとおりです。

def calculate(t):
    t1 = {}    # first time we encounter an index
    t2 = {}    # product of values
    for index, value in t:
        if index in t1:    # we have seen this index already
            if index not in t2:    # start the multiplier
                t2[index] = t1[index]
            t2[index] *= value     # chain multiplication
        else:
            t1[index] = value      # first time for this index
    return sum(t2.values())    # sum of multipliers
于 2013-05-29T22:56:43.253 に答える
0

以下は単純な手続き型バージョンです。

tups=[(1,4),(3,5),(2,9),(6,23),(3,21),(2,66),(5,20),(1,33),(3,55),(1,8)]

di={}
for t in tups:
    di.setdefault(t[0],[]).append(t[1])

ans=0
for k in di:
    if len(di[k])==1: continue
    x=1
    for e in di[k]: x*=e
    ans+=x

print ans  

プリント 7425

短い手順バージョンが必要な場合:

di={}
for t in tups:
    di.setdefault(t[0],[]).append(t[1])
print sum(reduce(lambda x,y: x*y,l) for l in di.values() if len(l)>1)

そして、これはトリッキーなバージョンです(オオカミから):

di={}
{di.setdefault(t[0],[]).append(t[1]) for t in tups}
print sum(reduce(lambda x,y: x*y,l) for l in di.values() if len(l)>1)
于 2013-05-29T21:42:21.657 に答える
0

そのため、組み込み関数を使用したソリューションは既に投稿されていますが、通過して必要なことを実行するループを作成するのはそれほど余分ではありません。

>>> l = [(1,4),(3,5),(2,9),(6,23),(3,21),(2,66),(5,20),(1,33),(3,55),(1,8)]
>>> hold = []
>>> for i in range(min(l)[0],max(l)[0] + 1):
...     hold2 = []
...     mult = 1
...     for t in l:
...             if t[0] == i:
...                     hold2.append(t[1])
...                     mult *= t[1]
...     if len(hold2) > 1:
...             hold.append(mult)
... 
>>> sum(hold)
7425

各インデックスの数を確認するために 1 つの配列を設定し、異なるインデックスを反復処理して、一致するインデックスで次の数値を掛け続けます。

また、これは最速のバージョンになります。何もインポートせず、それを行うのに時間をかける必要がないという理由だけで。提供されたバージョンはすべて 1 秒未満ですが、退屈だったのですべての時間を計りました。

Mine: 0:00:00.000477

1_CR: 00:00.073498

RedBaron: 0:00:00.079276
于 2013-05-29T17:22:03.807 に答える