-1

私はpythonのようなリストを持っています

[{key1: valuea1, key2:valueb1}, {key1: valuea2, key2: valueb2}, ....{key1: valueaN, key2: valuebN}]

たとえば、valuea が複数回発生するすべての valuebs に -1 を掛ける効率的な方法は何ですか。

例えば:

[{key1: 5, key2:8}, {key1: 2, key2: 4}, {key1: 5, key2: 4}]

になります:

[{key1: 5, key2:-8}, {key1: 2, key2: 4}, {key1: 5, key2: -4}]

リストを2回ループするだけでなく、python/より優れたアルゴリズムに組み込まれたものを探しています。

ありがとう!

4

3 に答える 3

3

ワンパス アルゴリズムを探しているので、次のようになります。

def invert_dupes(lst):
    pos = {}
    for n, e in enumerate(lst):
        k = e['key1']
        if k in pos:
            if pos[k] >= 0:
                lst[pos[k]]['key2'] *= -1
                pos[k] = -1
            e['key2'] *= -1
        else:
            pos[k] = n
    return lst

各「キー」値について、最初に発生した位置を記憶し、再度発生した場合は、その位置と後続のすべての位置を反転します。

于 2013-02-07T11:22:55.657 に答える
0

これでうまくいくはずですが、リストを2回調べます。まず、すべてのkey1のリストを作成します。次に、リスト内のすべての辞書について、そのkey1値が複数回出現するかどうかを確認します。その場合は、key2の値に-1を掛けます。

myList = [{"key1": 5, "key2":-8}, {"key1": 2, "key2": 4}, {"key1": 5, "key2": -4}]
valueAs = [x["key1"] for x in myList]

for x in myList:
    if valueAs.count(x["key1"]) > 1:
        x["key2"] *= -1

Counterリストの代わりにユーザーが辞書の大規模なリストの効率をいくらか改善することができますcount()。このようにして、各値の出現回数は1回だけ計算されます。

from collections import Counter
valueAs = Counter([x["key1"] for x in myList])

for x in myList:
    if valueAs[x["key1"]] > 1:
        x["key2"] *= -1
于 2013-02-07T11:19:06.087 に答える
-1
from collections import Counter
valueAs = Counter([x["key1"] for x in myList])

for x in myList:
    if valueAs[x["key1"]] > 1:
        x["key2"] *= -1
于 2013-02-07T11:29:29.340 に答える