有没有办法在字典中存储重复的键?
我有一个特定的要求来形成请求和响应对.
从特定节点到另一个特定节点的请求形成相同的密钥.我需要存储这两个.
但是,如果我尝试将它们添加到字典中,则第一个将被替换为第二个.有什么办法吗?
sen*_*rle 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']})
Run Code Online (Sandbox Code Playgroud)您可以使用其他数据来消除键的歧义.这可以是时间戳,唯一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'}
Run Code Online (Sandbox Code Playgroud)虽然我不是100%肯定,但我很确定答案是肯定的.那种违反了python中字典的目的.如何将值更改为列表而不是
{Key:value}
Run Code Online (Sandbox Code Playgroud)
你有
{Key:[Value1,value2]}
Run Code Online (Sandbox Code Playgroud)
defaultdict
可能的另一种选择
d = {}
d.setdefault(newkey, []).append(newvalue)
Run Code Online (Sandbox Code Playgroud)
这样做也是如此:附加newvalue
到列表中,该列表已经在给定的字典中newkey
,或者如果没有,将被放在那里.