Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表作为值反转字典的最佳方法?_Python_List_Dictionary - Fatal编程技术网

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