同名的Dict

2024-10-03 06:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一本字典,它有两个同名但值不同的键。我尝试这样做的一种方法是创建一个类,在该类中我将放置字典的每个键名,以便它们是不同的对象:

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中可用的其他方法。


Tags: 对象方法nameself字典objectnamesinit
2条回答

你想用字典做什么是不可能的。事实上,这与词典背后的整体理念背道而驰。

而且,您的Sets类也不会帮助您,因为它有效地为每个名称赋予了一个新的(某种随机的)哈希代码,使得从字典中检索条目变得困难,除了检查所有条目之外,这会破坏dict的目的。您不能执行dict.get(Sets(some_name)),因为这将创建一个新的对象,与字典中已有的哈希代码不同!

你可以做的是:

  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)
    

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

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

与其想要多个同名的键,还不如避免每个键都有多个值?

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

相关问题 更多 >