2

is there any way to store duplicate keys in a dictionary?

I have a specific requirement to form pairs of requests and responses.

Requests from a particular node to another particular node form same keys. I need to store both those.

But if I tried to add them to dictionary, first one is being replaced by second. Is there any way?

4

8 に答える 8

10

I can think of two simple options, assuming you want to keep using a dictionary.

  1. You could map keys to lists of items. A defaultdict from the collections module makes this easy.

    >>> import collections
    >>> data = collections.defaultdict(list)
    >>> for k, v in (('a', 'b'), ('a', 'c'), ('b', 'c')):
    ...     data[k].append(v)
    ... 
    >>> data
    defaultdict(<type 'list'>, {'a': ['b', 'c'], 'b': ['c']})
    
  2. You could use additional data to disambiguate the keys. This could be a timestamp, a unique id number, or something else. This has the advantage of preserving a one-to-one relationship between keys and values, and the disadvantage of making lookup more complex, since you always have to specify an id. The example below shows how this might work; whether it's good for you depends on the problem domain:

    >>> for k, v in (('a', 'b'), ('a', 'c'), ('b', 'c')):
    ...     i = 0
    ...     while (k, i) in data:
    ...         i += 1
    ...     data[(k, i)] = v
    ... 
    >>> data
    {('a', 1): 'c', ('b', 0): 'c', ('a', 0): 'b'}
    
于 2012-06-21T15:29:55.767 に答える
9

100%確信はありませんが、答えはノーだと確信しています。そのようなものは、Pythonの辞書の目的に違反します。値をリストに変更するのではなく、

{Key:value}

あなたが持っている

{Key:[Value1,value2]}
于 2012-06-21T15:24:14.010 に答える
7

の代わりになるdefaultdictかもしれません

d = {}
d.setdefault(newkey, []).append(newvalue)

これは同じことを行います。newvalue指定された辞書にすでに存在するリストに追加するかnewkey、そうでない場合はそこに配置されます。

于 2012-06-21T15:28:11.433 に答える
4

リストを使用して、等しいキーのすべての値を格納します。

{a:b, a:c}  # foolish, won't work
{a: [ b, c ]}  # works like a charm!

あなたも使用したいかもしれません

from collections import defaultdict
d = defaultdict(list)
d[a].append(b)

簡単な方法で辞書に記入します。

于 2012-06-21T15:24:33.543 に答える
4

There is no way to do this, no. Dictionaries rely on the keys being unique - otherwise, when you request or set a key, what value would be returned or overwritten?

What you could do, however, is store a list as the value for the dictionary, and then add your values to that list, rather than replacing the existing value.

You might want to use a collections.defaultdict to do this, to avoid making the lists by hand each time a new key is introduced.

于 2012-06-21T15:22:59.253 に答える
1

を使った答えが好きcollections.defaultdictです。それは私がおそらく行く方法です。

しかし、それはdictまたはdictのような構造を前提としており、1対多のマッピングが正しい解決策です。質問を読み直すと、「要求と応答のペアを形成する」という要件は、より単純なタプルのリスト(またはリストのリスト)アプローチにつながる可能性があります。例えば:

pairs = []
pairs.append( (request, response) )

次のようなリストが作成される可能性があります。

[ ('GET /', 200), ('GET /index.html', 200), ('GET /x', 403), ('GET /', 200), ]

構造は軽いだけですが、やりたいことによっては問題ないかもしれません。

于 2012-06-21T16:52:56.383 に答える
1

A more elegant solution:

def add_to_dict(towhat, key, value):
    info = towhat.get(key, [])
    info.append(value)
    towhat[key] = info

alternate = {}

add_to_dict(alternate,"Andrew","Cambridge")
add_to_dict(alternate,"Barbara","Bloomsbury")
add_to_dict(alternate,"Andrew","Corsica")

print alternate
于 2016-11-17T10:31:54.993 に答える
0

辞書では、定義上、キーは一意の識別子である必要があります。次のいずれかを実行できます。

  1. 重複エントリを許可するリストやタプルなどの別のデータ構造を使用します。
  2. データベースがキーIDに自動インクリメントフィールドを使用するのとほぼ同じ方法で、辞書キーに一意の識別子を使用します。

要求と応答のペアを多数保存している場合は、とにかくデータベースを使用したほうがよい場合があります。それは確かに考慮すべきことです。

于 2012-06-21T15:26:54.013 に答える