有没有办法在字典中存储重复的键?
我有一个特定的要求来形成一对请求和响应。
从特定节点到另一个特定节点的请求形成相同的密钥。我需要存储这两个。
但是,如果我尝试将它们添加到字典中,则第一个将被第二个替换。有什么办法吗?
有没有办法在字典中存储重复的键?
我有一个特定的要求来形成一对请求和响应。
从特定节点到另一个特定节点的请求形成相同的密钥。我需要存储这两个。
但是,如果我尝试将它们添加到字典中,则第一个将被第二个替换。有什么办法吗?
假设您想继续使用字典,我可以想到两个简单的选项。
您可以将键映射到项目列表。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']})
您可以使用其他数据来消除键的歧义。这可以是时间戳、唯一 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'}
虽然我不是 100% 确定,但我很确定答案是否定的。这种违反了python中字典的目的。您如何将值更改为列表而不是
{Key:value}
你有
{Key:[Value1,value2]}
defaultdict
可能的替代方案是
d = {}
d.setdefault(newkey, []).append(newvalue)
这也是一样的:追加newvalue
到一个列表,该列表要么已经在给定的字典中newkey
,否则将被放在那里。
没有办法做到这一点,不。字典依赖于唯一的键 - 否则,当您请求或设置键时,将返回或覆盖什么值?
但是,您可以做的是将列表存储为字典的值,然后将您的值添加到该列表中,而不是替换现有值。
您可能希望使用 acollections.defaultdict
来执行此操作,以避免每次引入新密钥时手动制作列表。
使用列表存储相等键的所有值:
{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)
以一种简单的方式填写您的字典。
我喜欢使用collections.defaultdict
. 这就是我可能会走的路。
但这假设一个 dict 或类似 dict 的结构和一对多映射是正确的解决方案。重新阅读这个问题,“形成请求和响应对”的要求可能会导致更简单的元组列表(或列表列表)方法。例如:
pairs = []
pairs.append( (request, response) )
这可能会创建一个列表,例如:
[ ('GET /', 200), ('GET /index.html', 200), ('GET /x', 403), ('GET /', 200), ]
它只是结构简单,但取决于你想用它做什么,可能没问题。
更优雅的解决方案:
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
根据定义,字典要求键是唯一标识符。您可以:
如果您要存储大量请求/响应对,则无论如何最好使用数据库。这当然是要考虑的事情。