以列表作为值来反转字典的最佳方法?

时间:2016-04-13 18:14:04

标签: python list dictionary

我目前有这样的词典:

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

我相信这是我遇到的问题,因为我无法成功地从名单中删除支柱。

3 个答案:

答案 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'}