#python #list #dictionary #data-structures #nested
Вопрос:
Тому, кто это читает. У меня возникли проблемы с выполнением задания на моем первом курсе Python. Что мне нужно сделать, так это создать программу, которая считывает файл, состоящий из разных песен, их жанров и рейтингов. Эта информация будет содержаться в файле в одной строке на одну стопку информации. Подобный этому:
Rap;Gangsta's paradise;88 Pop;7 rings;90 Classic;La Campanella;72 Rap;Still D.R.E;82 Pop;MONTERO;79
В программе я исключен, чтобы выбрать хорошую структуру данных (которая представляет собой комбинацию двух более простых структур данных), в которой будут сохранены данные из файла. Используя структуру данных, которую я создаю, я должен выполнять различные типы функций, которые, например, распечатывают все и добавляют в него новые материалы и т. Д. и т. Д.
Я решил создать структуру данных, объединив диктант и список, так, чтобы был создан диктант, ключами которого являются жанры, а его значениями являются списки [песен и их рейтинги]. (Я не совсем уверен, что это самый мудрый способ сделать это…)
Однако сейчас у меня возникли проблемы с запуском кода, потому что я не могу правильно создать структуру данных. Как то, что я пробовал, я приводил только к ситуациям, когда я мог правильно определить ключевое значение словаря (жанр), но списки в качестве значения словаря вызывают у меня проблемы.
Вот мой код:
def main(): filename = input("Please, enter the file name: ") # Opening the file in try-except bracket. If the file can't be opened, the # program prints out an error message and shuts down. try: file = open(filename, mode="r") except OSError: print("Error opening the selected file!") return # Defining a dict, where the lists will be inputed. dict = {} # Going trough each line in the file. for line in file: # Breaking each line of the file into a list. line = line.strip() parts = line.split(";") # Defining variables for different list values. The values will # be in the file in this order. genre = parts[0] track = parts[1] rating = int(parts[2]) # Inputing each every data in the dict like this: # genre is the dict's key and track, rating are the values IN A LIST! if genre not in dict: dict[genre] = [] dict[genre].append(track) dict[genre].append(rating) # The dict now looks like this: # {'Rap': ["Gangsta's paradise", 88, 'Still D.R.E', 82], etc. # When it should look like this: # {'Rap': [["Gangsta's paradise", 88], ['Still D.R.E', 82]], etc. # Wrong type values now cause problems in this print section, because # I can't print out all possible songs in a specific rating, because I # can't go trough the lists properly. for genres in dict: print(genres.upper()) print(f"{dict[genres][0]}, rating: {dict[genres][1]}/100") file.close() if __name__ == "__main__": main()
В конце концов, я бы сказал, прежде чем вы даже попытаетесь помочь мне форматированием моего кода: это лучший способ сделать это или есть более простая структура данных, которая могла бы помочь мне выполнить мою задачу? Заранее большое вам спасибо, это много значит для меня.
Комментарии:
1. Вы могли бы сохранить трек и рейтинг вместе, возможно, в кортеже.
your_dict[genre].append((track, rating))
2. Кроме того, не используйте
dict
в качестве имени переменной — это перезапишет встроеннуюdict
функцию.3. Примечание: я предлагаю использовать массив словарей, т. Е.
[song 1, song 2]
, чтобы это выглядело примерно так[{"genre":"...","track":"...","rating":"..."}, {"genre":"...","track":"...","rating":"..."}]
.4. Спасибо вам обоим за ваш совет, он действительно помог.
Ответ №1:
Это показывает, как сохранить трек и рейтинг вместе в кортеже и как выполнить итерацию по собранным вами кортежам:
def main(): filename = input("Please, enter the file name: ") # Opening the file in try-except bracket. If the file can't be opened, the # program prints out an error message and shuts down. try: file = open(filename, mode="r") except OSError: print("Error opening the selected file!") return # Defining a data, where the lists will be inputed. data = {} # Going trough each line in the file. for line in file: # Breaking each line of the file into a list. line = line.strip() parts = line.split(";") # Defining variables for different list values. The values will # be in the file in this order. genre = parts[0] track = parts[1] rating = int(parts[2]) if genre not in data: data[genre] = [] data[genre].append((track,rating)) for genre,tunes in data.items(): print(genre.upper()) for tune in tunes: print(f"{tune[0]}, rating: {tune[1]}/100") file.close() if __name__ == "__main__": main()
Комментарии:
1. Этот способ отлично работает и служит своей цели! Большое спасибо. Кортежи не приходили на ум, так как у нас действительно не было упражнений, в которых их можно было бы использовать.
2. Списки из двух элементов будут работать так же хорошо.