Есть ли лучший способ переупорядочить значения словаря?

#python #dictionary

#python #словарь

Вопрос:

У меня есть следующий словарь:

     files = {
    'Input.txt': 'Randy',
    'Code.py': 'Stan',
    'Output.txt': 'Randy'}
  

Я хотел бы вернуть словарь, где ключами являются имена, а соответствующим значением является список имен файлов:

     {'Randy': ['Input.txt', 'output.txt'], 'Stan': ['Code.py']}
  

Мне удалось сделать это с помощью 2 циклов for:

 def group_by_owners(files):
    my_dict = {}

    for value in files.values():
        if value not in my_dict:
            my_dict[value] = []
            
    for key, value in files.items():
        if value in my_dict.keys():
            my_dict[value].append(key)

    return my_dict
  

Есть ли более эффективный / элегантный способ сделать это?

Спасибо

Ответ №1:

Вариант 1: defaultdict

Словарь по умолчанию со значением по умолчанию в виде пустого списка, поэтому вы добавляете к нему значения.

Это решение предпочтительнее.

 files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'}

from collections import defaultdict
inv_map = defaultdict(list)
{inv_map[v].append(k) for k, v in files.items()}

# {'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}
print(inv_map)
  

Вариант 2: Словарь

 files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'}

inv_map = {}
for k, v in files.items():
    inv_map[v] = inv_map.get(v, [])   [k]

# {'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}
print(inv_map)

  

Комментарии:

1. Просто используйте defaultdict .

2. Первый вариант создает пустое значение lost независимо от того, необходимо это или нет.

3. Оба варианта должны использовать append . Например, inv_map[v] = inv_map.get(v, []) [k] следует делать inv_map.get(v, []).append(k)

4. @MadPhysicist: На самом деле inv_map[v].append(k) достаточно.

5. @MadPhysicist Спасибо за комментарий, но при запуске предложенной альтернативной строки результирующий словарь пуст.

Ответ №2:

Вот мой взгляд на это. Использование defaultdict , чтобы избежать создания начального списка, и просто использовать append

 from collections import defaultdict

def group_by_owners(files):
    # Creates a dictionary that it's initial value is a list
    # therefore you can just start using `append`
    result = defaultdict(list)
    for key, value in files.items():
        result[value].append(key)
    return result
  

Комментарии:

1. Я бы удалил апострофы вокруг значения.