2

有没有办法在字典中存储重复的键?

我有一个特定的要求来形成一对请求和响应。

从特定节点到另一个特定节点的请求形成相同的密钥。我需要存储这两个。

但是,如果我尝试将它们添加到字典中,则第一个将被第二个替换。有什么办法吗?

4

8 回答 8

10

假设您想继续使用字典,我可以想到两个简单的选项。

  1. 您可以将键映射到项目列表。defaultdict来自模块的 Acollections使这很容易。

    >>> 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. 您可以使用其他数据来消除键的歧义。这可以是时间戳、唯一 ID 号或其他内容。这具有保留键和值之间的一对一关系的优点,以及使查找更复杂的缺点,因为您总是必须指定一个id. 下面的例子展示了它是如何工作的;是否对您有好处取决于问题域:

    >>> 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

没有办法做到这一点,不。字典依赖于唯一的键 - 否则,当您请求或设置键时,将返回或覆盖什么值?

但是,您可以做的是将列表存储为字典的值,然后将您的值添加到该列表中,而不是替换现有值。

您可能希望使用 acollections.defaultdict来执行此操作,以避免每次引入新密钥时手动制作列表。

于 2012-06-21T15:22:59.253 回答
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 回答
1

我喜欢使用collections.defaultdict. 这就是我可能会走的路。

但这假设一个 dict 或类似 dict 的结构和一对多映射是正确的解决方案。重新阅读这个问题,“形成请求和响应对”的要求可能会导致更简单的元组列表(或列表列表)方法。例如:

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

这可能会创建一个列表,例如:

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

它只是结构简单,但取决于你想用它做什么,可能没问题。

于 2012-06-21T16:52:56.383 回答
1

更优雅的解决方案:

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 回答