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