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中可用的其他方法。
你想要做的事情用字典是不可能的。事实上,这与字典背后的整个想法是相反的。
另外,你的Sets类不会帮助你,因为它有效地为每个名称提供了一个新的(某种随机的)哈希码,使得除了检查所有项目之外,很难从字典中检索项目,这违背了字典的目的。你不能这样做dict.get(Sets(some_name)),因为这将创建一个新 Sets对象,其哈希码与字典中已有的哈希码不同!
你可以做的是:
只需创建一个对列表(name, value),或者
pairs = zip(names, values) # or list(zip(...)) in Python 3
Run Code Online (Sandbox Code Playgroud)创建一个字典,将名称映射到值列表。
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)
| 归档时间: |
|
| 查看次数: |
19815 次 |
| 最近记录: |