Я пытаюсь создать объединенный словарь из словаря словарей

#python #list #dictionary

#python #Список #словарь

Вопрос:

Я пытаюсь преобразовать словарь виниловых альбомов, который генерирует программа (‘sample_music_dict’) ниже, в новый словарь (см. Ниже, ‘new_music_dict’), который объединяет альбомы по исполнителям в единый список, где исполнитель становится ключевым. Затем я буду использовать этот новый словарь для создания отпечатков, списков экранов и других вещей.

Исходный словарь. Это словарь, из которого я хочу преобразовать

 sample_music_dict = {
    
    'A-HA': [
        'A-Ha',
        ['HEADLINES amp; DEADLINES', 'Headlines amp; Deadlines', 'Jan-17', '']
    ],

    'ABC': [
        'Abc',
        ['THE LEXICON OF LOVE', 'The Lexicon Of Love', 'Jan-17', '']
    ],

    'AC/DC': [
        'Ac/Dc',
        ['BACK IN BLACK', 'Back In Black', 'Jan-17', ''],
        ['HIGHWAY TO HELL', 'Highway to Hell', 'Jan-17', '']
    ],

    'JON ANDERSON': [
        'Jon Anderson',
        ['3 SHIPS', '3 Ships', 'Nov-19', ''],
        ['IN THE CITY OF ANGELS', 'In The City Of Angels', 'Jan-17', ''],
        ['OLIAS OF SUNHILLOW', 'Olias of Sunhillow', 'Jan-17', '']
    ]

}
 

Целевой словарь. Это словарь, в который я хочу преобразовать

 new_music_dict = {
    'Abba':['Abba Greatest Hits Vol.2'],
    'ABC':['The Lexicon Of Love'],
    'AC/DC':['Back In Black','Highway to Hell'],
    'All About Eve':['All About Eve'],
    'Jon  Anderson':['3 Ships','In The City Of Angels','Olias of 
    Sunhillow']
    }
 

Чтобы решить эту проблему, я попытался выполнить итерацию через исходный словарь, используя операторы code for и while, но я не мог понять, как извлекать данные в формат списка, который мне нужен.

Например, если я разбиваю исходный словарь на его базовую форму, у него есть КЛЮЧ (имя исполнителя В верхнем регистре), ЗНАЧЕНИЕ представляет собой список, содержащий имя исполнителя в регистре заголовка, за которым следует несколько списков — по одному списку для каждого альбома для исполнителя. В каждом вложенном списке at находится название альбома и три другие части информации об альбоме. Вот так:

 sample_music_dict = {
'KEY': 
['Value' 
['L1_0 - Album Nme', 'L1_1- Info1', 'L1_2- Info2', 'L1_3- Info3',
 ['L2_0 - Album Nme', 'L2_1- Info1', 'L2_2- Info2', 'L2_3- Info3'],
  ['L3_0 - Album Nme', 'L3_1- Info1', 'L3_2- Info2', 'L3_3- Info3'], 
   ['L4_0 - Album Nme', 'L4_1- Info1', 'L4_2- Info2', 'L4_3- Info3']
}
 

я хочу создать словарь, в котором КЛЮЧ указан как имя исполнителя, а затем один список со всеми названиями альбомов для этого исполнителя. Как показано ниже:

 new_music_dict = {
  'KEY': ['L1_0 - Album Nme','L2_0 - Album Nme',
  'L3_0 - Album Nme','L4_0 - Album Nme'] 
  }
 

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

Как только я смогу создать нужный мне формат целевого словаря, я смогу затем использовать новый словарь для вывода табличных данных (PrettyTable или TextTable), а также создавать различные функции в моей программе.

Любая помощь или предложения? Спасибо.

Ответ №1:

Спасибо за редактирование вашего первоначального вопроса и за то, что приложили к нему столько усилий! Вот решение, которое, похоже, работает:

 import pprint

sample_music_dict = {
    
    'A-HA': [
        'A-Ha',
        ['HEADLINES amp; DEADLINES', 'Headlines amp; Deadlines', 'Jan-17', '']
    ],

    'ABC': [
        'Abc',
        ['THE LEXICON OF LOVE', 'The Lexicon Of Love', 'Jan-17', '']
    ],

    'AC/DC': [
        'Ac/Dc',
        ['BACK IN BLACK', 'Back In Black', 'Jan-17', ''],
        ['HIGHWAY TO HELL', 'Highway to Hell', 'Jan-17', '']
    ],

    'JON ANDERSON': [
        'Jon Anderson',
        ['3 SHIPS', '3 Ships', 'Nov-19', ''],
        ['IN THE CITY OF ANGELS', 'In The City Of Angels', 'Jan-17', ''],
        ['OLIAS OF SUNHILLOW', 'Olias of Sunhillow', 'Jan-17', '']
    ]

}

def get_pairs():
    from operator import itemgetter
    for key, value in sample_music_dict.items():
        yield key, list(map(itemgetter(1), value[1:]))

new_music_dict = dict(get_pairs())

pprint.pprint(new_music_dict)
 

Вывод:

 {'A-HA': ['Headlines amp; Deadlines'],
 'ABC': ['The Lexicon Of Love'],
 'AC/DC': ['Back In Black', 'Highway to Hell'],
 'JON ANDERSON': ['3 Ships', 'In The City Of Angels', 'Olias of Sunhillow']}
>>> 
 

pprint Модуль не является строго обязательным, это просто для того, чтобы я мог получить красиво напечатанный вывод. Вы говорили, что хотите, чтобы строки в списках исходили из первого «столбца» (индекса) каждого списка альбомов — но разве это не должен быть второй индекс, а не первый? Поскольку первый индекс содержит заголовок с заглавными буквами… Это решение предполагает, что название альбома, которое мы хотим, находится во втором индексе каждого списка альбомов.

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

1. Привет, я обновил свой вопрос и, надеюсь, четко объяснил, что я хочу решить. Спасибо.

2. @milesabc123 Спасибо, я отредактировал свой ответ.

3. Привет, Пол, большое спасибо за предложение, оно сработало действительно хорошо. Мне было интересно, хочу ли я извлечь название альбома и дату, можно ли изменить предоставленный вами код для обработки нескольких индексов в списке? Спасибо

4. @milesabc123 Рад, что это работает. Чтобы получить как название альбома, так и дату, вы можете просто изменить itemgetter(1) на itemgetter(1, 2) . Однако это приведет к получению пар ключ-значение, где значениями являются списки кортежей. Я не знаю, хотите ли вы этого. Каким будет желаемый результат в этом случае?

Ответ №2:

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

«‘ sample_data = {‘ИДЕАЛЬНЫЙ РЕЦЕПТ БЛИНОВ’: [‘Идеальный рецепт блинов’, [‘100 г обычной муки’, ‘2 яйца’, ‘300 мл полуобезжиренного молока’, ‘1 ст. л. подсолнечного или растительного масла, плюс дополнительно для жарки’, ‘щепотка соли’],[‘1. Положите 100 г обычной муки и щепотку соли в большую миску для смешивания. ‘, ‘2. Сделайте углубление в центре и разбейте 2 яйца в середину.’], ‘bbc’] }

 def get_pairs_new():
    from operator import itemgetter
    for key, value in sample_data.items():
        yield key, list(map(itemgetter(1), value[1:]))


recipe = dict(get_pairs_new())
print(new_music_dict)


t = Texttable()
for key, value in recipe.items():
artist = key
album = ("n".join(value))
t.add_rows([['Artist', 'Album'], [artist, album]])
print(t.draw())
 

»’

А затем иметь возможность печатать в таблице название, ингредиенты, инструкции и источник рецепта. Если я изменяю itemgetter(1) на itemgetter(1,2), он возвращает кортеж, а затем программа завершается сбоем. Спасибо