Как выбрать случайное значение из ряда (row)?

455 просмотра
0
0 Комментариев

Нуждаюсь в помощи, Не знаю каким образом отобразить только одно рандомное значение из ряда «albums»
Задача такая — выбрав жанр показать рандомный альбом этого жанра.
на скрине ниже видно, что выбрав жанр высвечивается рад альбомов этого жанра,так вот вопрос как высветить один рандомный? Либо из ряда это сделать нельзя и придется создавать отдельный список?

import csv
import random
 
while True:
 
    music = []
 
with open('music.csv', 'r') as f:
            read_csv = csv.reader(f, delimiter="|")
 
            artist = row[0]
            album = row[1]
            year = row[2]
            genre = row[3]
            time = row[4]
 
            name_tuple = (artist, album)
            info_tuple = (year, genre, time)
            global_tuple = (name_tuple, info_tuple)
 
 
 
            music.append(global_tuple)
 
 answer = input()
        if answer == "8":
        ran_g = input("Choose genre: ")
        for global_tuple in music:
            if ran_g.lower() == global_tuple[1][1]:
                print(global_tuple[0][1]) - высвечивается ряд альбомов жанра ran_g
                print(random.choice(global_tuple[0][1]) ??? - нужно что-то вроде такого осуществить

на скрине видно, что выбрав жанр высвечивается рад альбомов этого жанра,так вот вопрос как высветить один рандомный?


Добавить комментарий

1 Ответы

Python Опубликовано 18.12.2018
0

Зачем вы бесконечно читаете файл? Это нужно убрать!

Вот вариант решения. Но учитывайте, что требуется полное совпадение, включая пробелы, и, как я помню, они у вас есть. Для CSV не нужны пробелы, его разделитель — это разделитель (обычно — запятая).

import csv
import random
 
music = []
 
with open('music.csv', 'r') as f:
    read_csv = csv.reader(f, delimiter="|")
 
    for row in read_csv:
        artist = row[0]
        album = row[1]
        year = row[2]
        genre = row[3]
        time = row[4]
 
        name_tuple = (artist, album)
        info_tuple = (year, genre, time)
        global_tuple = (name_tuple, info_tuple)
 
        music.append(global_tuple)
 
 
albums_list = []
 
while True: # бесконечно требуем ввод
    answer = input('Choose genre: ')
 
    for album in music: # пробегаемся по списку music
        for info in album[1]: # в каждом элементе заходим на вкладку info_tuple
            if info == answer: # если жанр совпал
                albums_list.append(album) # добавляем альбом в список
 
    x = random.randint(0, len(albums_list) - 1) # берём случайное число в радиусе "0 - длина списка - 1"
    print(albums_list[x]) # выводим альбом с индексом этого полученного числа
 
    albums_list.clear() # очищаем список

Также можно не писать цикл для того, чтобы пробегаться по всем элементам, а просто написать такую конструкцию:

for album in music: # пробегаемся по списку music
    if answer in album[1]: # справшиваем находится ли нужный нам жанр в в info_tuple
        albums_list.append(album) # если да, то добавляем album в album_list

Но в вашем случае при вводе rap будет создаваться пустой массив, потому что между разделителями находятся пробелы. А вот если ввести rap с пробелами вокруг слова, то тогда мы получим рандомный альбом на выходе.

Чтобы избежать этого, можно прибегнуть к регулярным выражениям. Для этого в первую очередь необходимо будет подключить модуль re. Ну и конструкция наша будет выглядеть примерно так:

albums_list = []
 
while True:
    answer = input('Choose genre: ')
    pattern = r'\b' + answer + r'\b'
 
    for album in music:
        for info in album[1]:
            if re.search(pattern, info):
                albums_list.append(album)
 
    x = random.randint(0, len(albums_list) - 1)
    print(albums_list[x])
 
    albums_list.clear()

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up