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



我正在创建一个程序来对音乐库文件进行排序。我有一个特定的功能,generateRandomPlaylist(musicLibDictionary),我坚持使用。

该函数需要从字典中随机选择一个键,并将其中一个值随机分配给该键。例如,字典中的艺术家包括The Who,Adele和The Beatles。各自的专辑包括汤米;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()

如果我理解正确,您希望每位艺术家以随机顺序精确地获得一次,并且每个艺术家的随机专辑,这里有一种方法可以做到这一点:

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]

最新更新