Как ввести список в список в словарь на Python

#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. Списки из двух элементов будут работать так же хорошо.