Python 将列表作为值反转字典的最佳方法?
我目前有一本这样的词典:Python 将列表作为值反转字典的最佳方法?,python,list,dictionary,Python,List,Dictionary,我目前有一本这样的词典: app_dict = {test1 : [[u'app-1', u'app-2', u'app-3', u'app-4']]} 我有一个反转字典的函数(它被证明与另一个字典一起工作) 执行以下操作时,我会收到一个错误: data = reverse_dictionary(app_dict) print data ERROR: return dict( (v,k) for k in app_dict for v in app_dict[k] ) TypeError:
app_dict = {test1 : [[u'app-1', u'app-2', u'app-3', u'app-4']]}
我有一个反转字典的函数(它被证明与另一个字典一起工作)
执行以下操作时,我会收到一个错误:
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
编辑:
请注意,在此时打印新目录时,我的字典值以以下格式显示(带双括号):
[[u'app-1',u'app-2',u'app-3',u'app-4']
如果我将附加行更改为:
新目录[o]。追加(q[0][0])
我假设它会去掉外括号,而不是这个,它只附加列表中的第一个值:
[u'app-1']
我相信这就是我遇到的问题,我无法成功地从列表中删除外括号。如果我使用您的编辑,这可能会起作用
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)
错误只是说列表不能用作字典中的键,因为它们是可变的。但是,元组是不可变的,因此可以用作键 可能的解决办法是:
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])
这与您拥有的反向函数相同,但考虑到字典包含一个列表列表,其中仅使用了第一个元素。我认为数据的格式不正确,因此使用了双括号,但经过这种修改,它是有效的
>>> 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'}
提示:双括号是另一个列表中的一个列表。请查看我的更新帖子。我知道这是问题所在,但我不确定如何更正。因此,您希望
new\u dict
的值只是一个值列表?请发布预期输出的示例。这个问题与你在评论中的内容不符。我如何在我的dict中添加一个值列表?目前,我似乎只能在列表中附加一个列表,或者每个单独的元素。我似乎在这两个列表之间跳过,而不仅仅是一个列表。我尝试了更新后的函数并得到了TypeError:列表索引必须是整数,而不是Unicode。虽然此代码可能会回答这个问题,但提供有关为什么和/或如何回答这个问题的附加上下文将显著提高其长期价值。请在您的回答中添加一些解释。
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])
>>> 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'}