Dict with same keys names

匿名 (未验证) 提交于 2019-12-03 02:43:01

问题:

I need a dictionary that has two keys with the same name, but different values. One way I tried to do this is by creating a class where I would put the each key name of my dictionary, so that they would be different objects:

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 

The result I was expecting was:

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

But instead it was:

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

[EDIT] So I discovered that keys in a dictionary are meant to be unique, having two keys with the same name is a incorrect use of dictionary. So I need to rethink my problem and use other methods avaliable in Python.

回答1:

What you are trying to do is not possible with dictionaries. In fact, it is contrary to the whole idea behind dictionaries.

Also, your Sets class won't help you, as it effectively gives each name a new (sort of random) hash code, making it difficult to retrieve items from the dictionary, other than checking all the items, which defeats the purpose of the dict. You can not do dict.get(Sets(some_name)), as this will create a new Sets object, having a different hash code than the one already in the dictionary!

What you can do instead is:

  1. Just create a list of (name, value) pairs, or

    pairs = zip(names, values) # or list(zip(...)) in Python 3 
  2. create a dictionary mapping names to lists of values.

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

The first approach, using lists of tuples, will have linear lookup time (you basically have to check all the entries), but the second one, a dict mapping to lists, is as close as you can get to "multi-key-dicts" and should serve your purposes well. To access the values per key, do this:

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


回答2:

Instead of wanting multiple keys with the same name, could you getting away of having multiple values per each key?

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

Output:

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

Then you would access each value like this (or in a loop):

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!