3

私はpythonで辞書を持っています

d = {tags[0]: value, tags[1]: value, tags[2]: value, tags[3]: value, tags[4]: value}

この dict が 10 倍大きく、50 個のキーと 50 個の値があると想像してください。このタグで重複が見つかる場合がありますが、それでも値は不可欠です。キーを複製せずに、代わりに値の合計を使用して新しい dict を受け取るように単純にトリミングするにはどうすればよいですか?

d = {'cat': 5, 'dog': 9, 'cat': 4, 'parrot': 6, 'cat': 6}

結果

d = {'cat': 15, 'dog': 9, 'parrot': 6}

4

8 に答える 8

7

Paul Seeb の回答を改善したいと思います。

tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)]
result = {}
for k, v in tps:
  result[k] = result.get(k, 0) + v
于 2012-05-18T14:39:24.760 に答える
5
tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)]

from collections import defaultdict

dicto = defaultdict(int)

for k,v in tps:
    dicto[k] += v

結果:

>>> dicto
defaultdict(<type 'int'>, {'dog': 9, 'parrot': 6, 'cat': 15})
于 2012-05-18T14:51:56.290 に答える
2

それらのことを口述するだけでなく(口述に同じキーの倍数を含めることはできません)、タプルペアのリストにそれらを入れることができると思います。次に、それは同じくらい簡単です

tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)]
result = {}
for k,v in tps:
    try:
        result[k] += v
    except KeyError:
        result[k] = v

>>> result
{'dog': 9, 'parrot': 6, 'cat': 15}

私のものをより明示的なtry-except処理に変更しました。Alfe's は非常に簡潔ですが、

于 2012-05-18T14:32:42.650 に答える
2

これは、 Counterデータ構造を使用するのに最適な状況です。よく知られているいくつかのデータ構造でそれが何をするかを見てみましょう。古き良きリストから始めましょう。

>>> from collections import Counter
>>> list_a = ["A", "A", "B", "C", "C", "A", "D"]
>>> list_b = ["B", "A", "B", "C", "C", "C", "D"]
>>> c1 = Counter(list_a)
>>> c2 = Counter(list_b)
>>> c1
Counter({'A': 3, 'C': 2, 'B': 1, 'D': 1})
>>> c2
Counter({'C': 3, 'B': 2, 'A': 1, 'D': 1})
>>> c1 - c2
Counter({'A': 2})
>>> c1 + c2
Counter({'C': 5, 'A': 4, 'B': 3, 'D': 2})
>>> c_diff = c1 - c2
>>> c_diff.update([77, 77, -99, 0, 0, 0])
>>> c_diff
Counter({0: 3, 'A': 2, 77: 2, -99: 1})

ご覧のとおり、これは要素の出現回数を値として保持するセットとして動作します。うーん、でもリストの代わりに辞書を使うのはどうですか? ディクショナリ自体はセットのような構造で、値に数値を含める必要はありません。では、どのように処理されるのでしょうか? 見てみましょう。

>>> dic1 = {"A":"a", "B":"b"}
>>> cd = Counter(dic1)
>>> cd
Counter({'B': 'b', 'A': 'a'})
>>> cd.update(B='bB123')
>>> cd
Counter({'B': 'bbB123', 'A': 'a'})


>>> dic2 = {"A":[1,2], "B": ("a", 5)}
>>> cd2 = Counter(dic2)
>>> cd2
Counter({'B': ('a', 5), 'A': [1, 2]})
>>> cd2.update(A=[42], B=(2,2))
>>> cd2
Counter({'B': ('a', 5, 2, 2), 'A': [1, 2, 42, 42, 42, 42]})
>>> cd2 = Counter(dic2)
>>> cd2
Counter({'B': ('a', 5), 'A': [1, 2]})
>>> cd2.update(A=[42], B=("new elem",))
>>> cd2
Counter({'B': ('a', 5, 'new elem'), 'A': [1, 2, 42]})

ご覧のとおり、追加/変更する値は、同じタイプである必要があります。そうでupdateない場合は、 がスローされTypeErrorます。あなたの特定のケースについては、流れに沿って進んでください

>>> d = {'cat': 5, 'dog': 9, 'cat': 4, 'parrot': 6, 'cat': 6}
>>> cd3 = Counter(d)
>>> cd3
Counter({'dog': 9, 'parrot': 6, 'cat': 6})
cd3.update(parrot=123)
cd3
Counter({'parrot': 129, 'dog': 9, 'cat': 6})
于 2017-05-30T20:11:23.870 に答える
1

あなたが何を達成しようとしているのかはわかりませんが、あなたがやろうとしていることには Counter クラスが役立つかもしれません: http://docs.python.org/dev/library/collections.html#collections.Counter

于 2012-05-18T15:12:36.460 に答える
1

おそらく、本当に必要なのtupleはキーと値のペアです。

[('dog',1), ('cat',2), ('cat',3)]
于 2012-05-18T14:40:49.657 に答える
0

重複したキー データを削除したいというご質問が正しく理解できた場合は、辞書の作成中に辞書の更新機能を使用してください。キーが重複している場合、データは上書きされます。

tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)]
result = {}
for k, v in tps:
    result.update({k:v})
for k in result:
    print "%s: %s" % (k, result[k]) 

出力は次のようになります: 犬: 9 オウム: 6 猫: 6

于 2014-06-17T16:16:13.463 に答える
0

このオプションは機能しますが、リストで行われるか、洞察を提供するのが最善です

data = []
        for i, j in query.iteritems():
            data.append(int(j))    
        try:
            data.sort()
        except TypeError:
            del data
        data_array = []
        for x in data:
            if x not in data_array:
                data_array.append(x)  
        return data_array
于 2012-05-18T14:37:58.920 に答える