有没有办法保存python字典中的重复键

new*_*555 2 python

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

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

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

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

sen*_*rle 10

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

  1. 您可以将键映射到项目列表.一个defaultdictcollections模块让一切变得简单.

    >>> 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)
  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'}
    
    Run Code Online (Sandbox Code Playgroud)


8bi*_*ide 8

虽然我不是100%肯定,但我很确定答案是肯定的.那种违反了python中字典的目的.如何将值更改为列表而不是

{Key:value}
Run Code Online (Sandbox Code Playgroud)

你有

{Key:[Value1,value2]}
Run Code Online (Sandbox Code Playgroud)


glg*_*lgl 6

defaultdict可能的另一种选择

d = {}
d.setdefault(newkey, []).append(newvalue)
Run Code Online (Sandbox Code Playgroud)

这样做也是如此:附加newvalue到列表中,该列表已经在给定的字典中newkey,或者如果没有,将被放在那里.