生成字典键集和值集的随机组合

2024-09-30 01:28:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个程序来对音乐库文件进行排序。我有一个特别的功能,generateRandomPlaylist(musicLibDictionary),我一直在使用它。你知道吗

该函数需要从字典中随机选取一个键,并将其中一个值随机分配给该键。例如,字典里的艺术家包括世卫组织、阿黛尔和披头士乐队。各自的专辑包括汤米;19,21,25;阿比路,让它吧。我需要程序随机选择一个键(艺术家),然后随机选择一个键的值。随机生成的播放列表需要有所有三个艺术家,而不是重复,但不同的艺术家专辑。按照我的设置方式,输出不一定使用所有三个艺术家。示例输出应如下所示:

Here is your random playlist:
- 25 by Adele
- Abbey Road by The Beatles
- Tommy by The Who

每次调用函数时,播放列表都应该不同。就像我说的,现在函数不能正常运行,我还收到一个打印错误,说我不能连接一个列表和一个字符串,所以我不知道我哪里出错了。你知道吗

程序代码如下:

# importing pickle
import pickle
import random

# declaration of functions
def displayMenu():
    print("Welcome to Your Music Library")
    print("Options:")
    print("\t1) Display Library")
    print("\t2) Display all artists")
    print("\t3) Add an album")
    print("\t4) Delete an album")
    print("\t5) Delete an artist")
    print("\t6) Search Library")
    print("\t7) Generate a random playlist")
    print("\t8) Make your own playlist")
    print("\t9) Exit")

def displayLibrary(musicLibDictionary):
    for key in musicLibDictionary:
        print("Artist: " + key)
        print("Albums: ")
        for album in musicLibDictionary[key]:
            print("\t- " + album)

def displayArtists(musicLibDictionary):
    print("Displaying all artists:")
    for key in musicLibDictionary:
        print(" - " + key)

def addAlbum(musicLibDictionary):
    artistName = input("Please enter the name of the artist you would like to add: ")
    albumName = input("Please enter the name of the album you would like to add: ")
    if artistName in musicLibDictionary.keys():
        musicLibDictionary[artistName].append(albumName)
    else:
        musicLibDictionary[artistName] = [albumName]

def deleteAlbum(musicLibDictionary):
    artist = input("Enter artist: ")
    albumToBeDeleted = input("Enter album: ")
    if artist in musicLibDictionary.keys():
        if albumToBeDeleted in musicLibDictionary[artist]:
            musicLibDictionary[artist].remove(albumToBeDeleted)
            return True
        else:
            return False
    else:
        return False

def deleteArtist(musicLibDct):
    artistToBeDeleted = input("Enter artist to delete: ")
    if artistToBeDeleted in musicLibDct.keys():
        del musicLibDct[artistToBeDeleted]
        return True
    else:
        return False

def searchLibrary(musicLibDictionary):
    searchTerm = input("Please enter a search term: ")
    searchTerm = searchTerm.lower()
    print("Artists containing" + searchTerm)
    for key in musicLibDictionary.keys():
        if searchTerm.lower() in key.lower():
            print("\t - ", end="")
            print(key)
    print("Albums containing" + searchTerm)
    for album in musicLibDictionary[key]:
        print("\t- " + album)

    for key in musicLibDictionary.keys():
        for album in musicLibDictionary[key]:
            if searchTerm in album.lower():
                print("\t - ", end="")
                print(album)

def generateRandomPlaylist(musicLibDictionary):
    print("Here is your random playlist:")
    for artist in musicLibDictionary.keys():
        artistSelection = random.choice(list(musicLibDictionary.keys()))
        albumSelection = random.choice(list(musicLibDictionary.values()))
    print("\t-" + albumSelection + "by" + artistSelection)


def loadLibrary(libraryFileName):
    fileIn = open(libraryFileName, "rb")
    val = pickle.load(fileIn)
    val = dict(val)
    return val

def saveLibrary(libraryFileName, musicLibDictionary):
    fileIn = open(libraryFileName, "wb")
    pickle.dump(musicLibDictionary, fileIn)

def main():
    musicLib = loadLibrary("musicLibrary.dat")
    userChoice = ""
    while (userChoice != 7):
        displayMenu()
        userChoice = int(input("> "))
        if userChoice == 1:
            displayLibrary(musicLib)
        elif userChoice == 2:
            displayArtists(musicLib)
        elif userChoice == 3:
            addAlbum(musicLib)
        elif userChoice == 4:
            deleteAlbum(musicLib)
        elif userChoice == 5:
            deleteArtist(musicLib)
        elif userChoice == 6:
            searchLibrary(musicLib)
        elif userChoice == 7:
            generateRandomPlaylist(musicLib)
        elif userChoice == 8:
            saveLibrary("musicLibrary.dat", musicLib)


# Call main
main()

Tags: keyinforinputalbumifartistdef
1条回答
网友
1楼 · 发布于 2024-09-30 01:28:34

这里有一种方法,如果我理解正确的话,你希望每一位艺术家以随机的顺序和每一位艺术家的一张随机专辑来做这件事:

def generateRandomPlaylist(musicLibDictionary):
    print("Here is your random playlist:")
    artists = list(musicLibDictionary.keys())
    random.shuffle(artists)  # Perform an in-place shuffle
    for artistSelection in artists:
        albumSelection = random.choice(list(musicLibDictionary[artistSelection]))
        print("\t-" + albumSelection + "by" + artistSelection)

我们知道我们只想要所有的艺术家一次,但顺序是随机的。因为字典的键是艺术家,所以我们只需对键执行random.shuffle,就可以得到艺术家的随机顺序。然后我们要查看每个艺术家的专辑(musicLibDictionary[artist]),然后做一个random.choice随机挑选一张专辑。你知道吗

您的代码逐行执行以下操作:

def generateRandomPlaylist(musicLibDictionary):
    print("Here is your random playlist:")
    for artist in musicLibDictionary.keys(): # For each artist
        artistSelection = random.choice(list(musicLibDictionary.keys()))  # Choose one artist randomly (not necessarily the one in your for loop)
        albumSelection = random.choice(list(musicLibDictionary.values()))  # Choose a random album list (musicLibDictionary.values() returns a list of lists, so you're just choosing a random discography (list) from a random artist)
    print("\t-" + albumSelection + "by" + artistSelection)  # Because this is not indented into your loop, you're likely only getting the last one chosen

添加字符串和列表时出现问题的原因(在python中不允许直接添加,必须先将列表强制转换为字符串)是因为albumSelection变量是随机艺术家的专辑的完整列表,甚至不一定是artistSelection变量中的艺术家。您的musicLibDictionary.values()返回类似[['Tommy'], ['19', '21', '25'], ['Abbey Road', 'Let It Be']]的内容。random.choice从提供给它的列表中选择一个随机值,因此给定一个类似[[1,2,3], [4,5,6]]的列表,它可以选择[1,2,3]。你知道吗

相关问题 更多 >

    热门问题