#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), он возвращает кортеж, а затем программа завершается сбоем. Спасибо