我目前有这样的词典:
app_dict = {test1 : [[u'app-1', u'app-2', u'app-3', u'app-4']]}
我有一个反转字典的函数(事实证明它与另一个字典一起工作)。
def reverse_dictionary(self, app_dict):
""" In order to search by value, reversing the dictionary """
return dict( (v,k) for k in app_dict for v in app_dict[k] )
执行以下操作时出错:
data = reverse_dictionary(app_dict)
print data
ERROR:
return dict( (v,k) for k in app_dict for v in app_dict[k] )
TypeError: unhashable type: 'list'
我不确定,但我认为问题在于我的字典是如何构建的,我不确定为什么我的列表中有双括号,我似乎无法删除它们。如何修改reverse_dictionary函数以使用app_dict?
编辑:
new_dict = collections.defaultdict(list)
app_dict = collections.defaultdict(list)
#at this point, we have filled app_dict with data (cannot paste here)
for o, q in app_dict.items():
if q[0]:
new_dict[o].append(q[0])
请注意,当我在此时打印new_dict时,我的字典值以下列格式显示(带双括号): [[u'app-1',u'app-2',u'app-3',u'app-4']]
如果我将追加行更改为: new_dict [O] .append(Q [0] [0]) 我假设会删除outter括号,而不是这个,它只会在列表中附加第一个值:
[u'app-1']
我相信这是我遇到的问题,因为我无法成功地从名单中删除支柱。
答案 0 :(得分:1)
错误只是说列表不能用作字典中的键,因为它们是可变的。但是,元组是不可变的,因此可以用作密钥。
可能的解决办法是:
def reverse_dictionary(self, app_dict):
""" In order to search by value, reversing the dictionary """
return dict( (v,k) if type(v) != list else (tuple(v), k) for k in app_dict for v in app_dict[k])
答案 1 :(得分:0)
如果我使用您的编辑,这可能会起作用
new_dict = collections.defaultdict(list)
app_dict = collections.defaultdict(list)
#at this point, we have filled app_dict with data (cannot paste here)
for o, q in app_dict.items():
if q[0]:
for value in q[0]:
new_dict[o].append(value)
答案 2 :(得分:0)
这与您所拥有的功能相同,但考虑到字典包含仅使用第一个元素的列表列表。我认为数据的格式不正确,因此是双括号,但通过这种修改,它可以工作。
>>> dict([(v, k) for k in app_dict for v in app_dict[k][0]])
{u'app-4': 'test1', u'app-3': 'test1', u'app-2': 'test1', u'app-1': 'test1'}