具有相同键名的Dict

时间:2015-06-04 16:05:18

标签: python class python-2.7 object dictionary

我需要一个字典,它有两个具有相同名称但值不同的键。我尝试这样做的一种方法是创建一个类,我将把我的字典的每个键名称放在一起,这样它们就会成为不同的对象:

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

我期待的结果是:

{"1": [1, 2, 3], "1": [4, 5, 6]}

但它恰好是:

{"1": [4, 5, 6]}

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

2 个答案:

答案 0 :(得分:2)

词典无法实现您的目标。事实上,它与字典背后的整个想法相反。

此外,您的Sets课程不会帮助您,因为它有效地为每个名称提供了一种新的(随机的)哈希代码,这使得从字典中检索项目变得困难,而不是检查< em> all 这些项目违背了dict的目的。您无法执行dict.get(Sets(some_name)),因为这会创建一个 Sets对象,其不同的哈希代码比字典中已有的哈希代码!

你能做的是:

  1. 只需创建(name, value)对的列表,或

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

    dictionary = {}
    for n, v in zip(names, values):
        dictionary.setdefault(n, []).append(v)
    
  3. 第一种方法,使用元组列表,将具有线性查找时间(您基本上必须检查所有条目),但第二种方法,一个映射到列表的字典,就像您可以到达&#34一样接近;多密钥类型的字典&#34;并应该很好地服务于你的目的。要访问每个键的值,请执行以下操作:

    for key, values in dictionary.iteritems():
        for value in values:
            print key, value
    

答案 1 :(得分:2)

不是想要使用相同名称的多个密钥,您是否可以避免每个密钥拥有多个值?

names = [1]
values = [[1, 2, 3], [4, 5, 6]]

dict = {}

for i in names:
    dict[i] = values

for k,v in dict.items():
    for v in dict[k]:
        print("key: {} :: v: {}".format(k, v))

输出:

key: 1 :: v: [1, 2, 3]
key: 1 :: v: [4, 5, 6]

然后你可以像这样(或循环)访问每个值:

print("Key 1 value 1: {}".format(dict[1][0]))
print("Key 1 value 2: {}".format(dict[1][1]))