#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. Я бы удалил апострофы вокруг значения.