Как случайным образом перетасовать список и затем предоставить его частями по 5 пунктов

#python #list #dictionary #project

Вопрос:

Я пытаюсь написать программу, в которой функция будет перемещаться по списку и выдавать мне только первые 5 песен. Затем, когда я спрашиваю пользователя, хотите ли вы увидеть больше, и пользователь отвечает «да», я хочу, чтобы он напечатал следующие 5 и продолжал до тех пор, пока не останется больше песен. Я работал над этим несколько дней и застрял. Вот мой код, если кто-нибудь может помочь.

 video_id_to_title = {  5390161: "Who Want Smoke",  7736243: "INDUSTRY BABY",  8267507: "STAY",  1012930: "Style",  1109274: "bad guy",  2981023: "Blank Space",  4922599: "Love Nwantiti Remix",  4559658: "Essence (Official Video)",  9897626: "Pepas",  5610524: "Outside (Better Days)",  6980497: "Lo Siento BB:/",  4547223: "Face Off",  9086699: "Heat Waves",  3720918: "Despacito",  9086691: "Royals",  1461025: "Fancy Like",  7434914: "Way 2 Sexy",  6093037: "Corta Venas",  6438692: "Need to Know",  8117542: "MONEY",  5746821: "Wild Side ",  9566779: "Knife Talk",  1683724: "Life Support",  5718817: "Save Your Tears",  2459304: "Ghost",  6382983: "Love Yourself",  7394792: "7 rings", }   top_hits_playlist = [  5390161, 7736243, 8267507, 4922599, 4559658, 9897626, 1461025, 5746821,  9566779, 5718817, 2459304, 6382983, 7394792 ]  def display_full_playlist(playlist_id: int):  user_playlist_choice = input("Which playlists do you want to see? ")  answer = input("Do you want to see more?")  song = 5  if user_playlist_choice == "Top Hits" or "top hits":  for i,x in enumerate(top_hits_playlist):  print(video_id_to_title[x])  if song == x:  print(answer)  if answer == "yes" or answer == "Yes":  print()  song  = 5  

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

1. В этой строке есть ошибка: if user_playlist_choice == "Top Hits" or "top hits": ; он не делает то, что вы, вероятно, намереваетесь сделать.

2. Вместо этого я предлагаю провести сравнение строк без учета регистра, например if user_playlist_choice.upper() == "TOP HITS": . То же самое касается и другого if утверждения.

3. Просто для полноты, это утверждение анализируется как if (user_playlist_choice == "Top Hits") or "top hits": , и строка «лучшие хиты» всегда верна.

Ответ №1:

Я пытаюсь написать программу, в которой функция будет перемещаться по списку и выдавать мне только первые 5 песен. Затем, когда я спрашиваю пользователя, хотите ли вы увидеть больше, и пользователь отвечает «да», я хочу, чтобы он напечатал следующие 5 и продолжал до тех пор, пока не останется больше песен.

На основе этой проблемы, я бы предложил случайной весь список видео идентификатор в плейлист во-первых, используя что-то вроде random.shuffle , так его более эффективным, поскольку вы только нужно перетасовать список один раз, а не генерирует случайный индекс в списке и затем переберем и удалением его из списка непрерывно, что также может сделать его более трудным для чтения. Таким образом, это должно быть проще, если цель состоит в том, чтобы перетасовать порядок самого списка воспроизведения.

Например:

 import random  video_id_to_title = {  5390161: "Who Want Smoke",  7736243: "INDUSTRY BABY",  8267507: "STAY",  1012930: "Style",  1109274: "bad guy",  2981023: "Blank Space",  4922599: "Love Nwantiti Remix",  4559658: "Essence (Official Video)",  9897626: "Pepas",  5610524: "Outside (Better Days)",  6980497: "Lo Siento BB:/",  4547223: "Face Off",  9086699: "Heat Waves",  3720918: "Despacito",  9086691: "Royals",  1461025: "Fancy Like",  7434914: "Way 2 Sexy",  6093037: "Corta Venas",  6438692: "Need to Know",  8117542: "MONEY",  5746821: "Wild Side ",  9566779: "Knife Talk",  1683724: "Life Support",  5718817: "Save Your Tears",  2459304: "Ghost",  6382983: "Love Yourself",  7394792: "7 rings", }  video_ids = list(video_id_to_title)  # Shuffle the list, so all the elements are randomized random.shuffle(video_ids)  # Set chunk size, so we get x videos from the playlist at a time chunk_size = 5  # Split list into sub-lists of at most 5 elements each video_id_chunks = [video_ids[x:x   chunk_size]  for x in range(0, len(video_ids), chunk_size)]  # Print each sub-list with randomized video ids for chunk in video_id_chunks:  print(chunk)  

Вывод (который каждый раз должен быть в другом порядке):

 [1012930, 4547223, 7394792, 7736243, 9086691] [6980497, 2459304, 8117542, 7434914, 9566779] [5390161, 6093037, 6438692, 4559658, 2981023] [8267507, 4922599, 9086699, 5610524, 6382983] [1683724, 1461025, 9897626, 1109274, 5746821] [3720918, 5718817]  

Ответ №2:

Вы можете создать итератор, который дает фрагменты по 5, и использовать функцию next (), чтобы получить следующий фрагмент, когда это необходимо:

 import random top_hits_playlist = [  5390161, 7736243, 8267507, 4922599, 4559658, 9897626, 1461025, 5746821,  9566779, 5718817, 2459304, 6382983, 7394792 ]  random.shuffle(top_hits_playlist) get5 = ( top_hits_playlist[i:i 5] for i in range(0,len(top_hits_playlist),5) )  songs = next(get5,None) while songs:  print(songs)  songs = next(get5,None)  if not songs: break  input('5 more')    [9566779, 7394792, 5390161, 5746821, 6382983] 5 more [7736243, 8267507, 5718817, 1461025, 2459304] 5 more [9897626, 4922599, 4559658]