具有相同键名称的字典

art*_*ckl 1 python dictionary class object python-2.7

我需要一个字典,其中有两个名称相同但值不同的键。我尝试执行此操作的一种方法是创建一个类,在其中放置字典的每个键名称,以便它们成为不同的对象:

names = ["1", "1"]
values = [[1, 2, 3], [4, 5, 6]]
dict = {}

class Sets(object):
    def __init__(self,name):
        self.name = name

for i in range(len(names)):
    dict[Sets(names[i])] = values[i]

print dict
Run Code Online (Sandbox Code Playgroud)

我期待的结果是:

{"1": [1, 2, 3], "1": [4, 5, 6]}
Run Code Online (Sandbox Code Playgroud)

但它却是:

{"1": [4, 5, 6]}
Run Code Online (Sandbox Code Playgroud)

[编辑] 所以我发现字典中的键应该是唯一的,有两个同名的键是对字典的错误使用。所以我需要重新思考我的问题并使用Python中可用的其他方法。

tob*_*s_k 5

你想要做的事情用字典是不可能的。事实上,这与字典背后的整个想法是相反的。

另外,你的Sets类不会帮助你,因为它有效地为每个名称提供了一个新的(某种随机的)哈希码,使得除了检查所有项目之外,很难从字典中检索项目,这违背了字典的目的。你不能这样做dict.get(Sets(some_name)),因为这将创建一个 Sets对象,其哈希码与字典中已有的哈希码不同!

你可以做的是:

  1. 只需创建一个对列表(name, value),或者

    pairs = zip(names, values) # or list(zip(...)) in Python 3
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个字典,将名称映射到值列表。

    dictionary = {}
    for n, v in zip(names, values):
        dictionary.setdefault(n, []).append(v)
    
    Run Code Online (Sandbox Code Playgroud)

第一种方法,使用元组列表,将具有线性查找时间(您基本上必须检查所有条目),但第二种方法,即映射到列表的字典,尽可能接近“多键字典” “并且应该很好地满足您的目的。要访问每个键的值,请执行以下操作:

for key, values in dictionary.iteritems():
    for value in values:
        print key, value
Run Code Online (Sandbox Code Playgroud)