问题 如何在Python中反转字典(其值为列表)?


我想编写一个接收字典作为输入参数的函数,并返回输入字典的反转,其中原始字典的值用作返回字典的键,原始字典的键用作值的值。返回字典,如下所述:

dict = {'Accurate': ['exact', 'precise'], 
        'exact': ['precise'], 
        'astute': ['Smart', 'clever'], 
        'smart': ['clever', 'bright', 'talented']}

dict = {'precise': ['accurate', 'exact'], 
        'clever': ['astute', 'smart'], 
        'talented': ['smart'], 
        'bright': ['smart'],
        'exact': ['accurate'],
        'smart': ['astute']}

返回字典中的值列表应按升序排序。资本化并不重要。这意味着所有单词都应转换为小写字母。例如,单词“Accurate”在原始字典中大写,但在返回的字典中,它是用所有小写字母书写的。

#My code is:
from collections import defaultdict
def reverse_dictionary(input_dict):
   d = defaultdict(list)
   for v,k in input_dict.items():
       d[k].append(v)
       return d

但它返回此错误:

Error in evaluating function:
TypeError at line 6
unhashable type: 'list'

6446
2018-03-11 16:40


起源

问题是你不能使用任何对象作为键 - 这些对象必须是不可变的,因此它们的哈希值在添加到字典后不会改变。在您的情况下,列表是可变的,因此它们不能用作键。你可以将它们转换为元组。 - Frédéric Hamidi
欢迎来到StackExchange!更多地考虑这个问题可能会有所帮助。例如,为什么会这样 'Accurate': ['exact', 'precise'] 成为 'precise': ['accurate', 'exact'] 代替 'exact': ['accurate', 'precise']?就您的错误消息而言,列表不能是您的字典键,但我认为更大的问题是您的任务需要澄清。 - Daniel Standage
此外,无法对词典进行排序。 - Farhan.K
@FrédéricHamidi他是 试 使用字符串作为键,而不是列表。他只是做得不对。 - zondo
对我来说似乎很清楚。值的内容成为键,键被添加到值中,因此 {'a': ['b', 'c']} 变 {'b': ['a'], 'c': ['a']}。 @DanielStandage,@ SteinarLima - Vincent Savard


答案:


你可以这么简单地做到这一点:

newdict = {}
for key, value in olddict.items():
    for string in value:
        newdict.setdefault(string, []).append(key)

7
2018-03-11 16:54



永远,总是,当机会出现时总是使用dict理解:) - DaveBensonPhillips
你能给个例子吗?我想不出一个会奏效的。 - zondo
哦,哎呀 - 我以为那就是你做的,我是愚蠢的。我并没有试图成为居高临下的人,但我意识到这正是我脱颖而出的道歉 - DaveBensonPhillips
坚果。我希望你能想出一个;)我拿出了列表理解,因为它确实不应该被使用。 - zondo
尽管如此我仍然很感激:) - DaveBensonPhillips


我将首先使用默认的dict交换键/值:

output_dict = defaultdict(list)
for key, values in input_dict.items():
    for value in values:
        output_dict[value.lower()].append(key.lower())

最后排序:

for key, values in output_dict.items():
    output_dict[key] = sorted(values)

4
2018-03-11 16:47





使用词典理解!

>>> evil_petting_zoo = {'bear':3, 'crocodile':1,'kangaroo':2,'goat':0}
>>> evil_petting_zoo.items()

dict_items([('bear', 3), ('crocodile', 1), ('kangaroo', 2), ('goat', 0)])

>>> {i[1]:i[0] for i in evil_petting_zoo.items()}

{3: 'bear', 1: 'crocodile', 2: 'kangaroo', 0: 'goat'}

TL; DR:

{i[1]:i[0] for i in myDictionary.items()}

3
2018-01-30 21:42





我如何扭转一个字典:

def reverse(org):
    return {v: k for k, v in org.items()}

print(reverse({1: 'a', 2: 'b'}))
# {'a': 1, 'b': 2}

0
2017-11-18 11:38



这个答案最适合我的问题(对于标准键:值dict)。谢谢 ;) - Dr. Younes Henni


这是答案,不使用任何模块:

def reverse_dictionary(input_dict):
    out = {}
    for v in input_dict.values():  
        for value in v:
            if value not in out:
                out[value.lower()] = []
    for i in input_dict:
        for j in out:
            if j in map (lambda x : x.lower(),input_dict[i]):
                out[j].append(i.lower())
                out[j].sort()
    return out

0
2017-12-18 16:16