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

时间:2012-06-21 15:20:12

标签: python

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

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

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

但如果我尝试将它们添加到字典中,首先要用第二个替换它们。有什么办法吗?

8 个答案:

答案 0 :(得分:10)

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

  1. 您可以将键映射到项目列表。来自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']})
    
  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'}
    

答案 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)

根据定义,字典要求密钥是唯一标识符。你可以:

  1. 使用不同的数据结构,例如允许重复输入的列表或元组。
  2. 为字典键使用唯一标识符,就像数据库可能使用自动递增字段作为其键ID一样。
  3. 如果要存储大量请求/响应对,最好还是使用数据库。这当然值得考虑。

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