music = {
"Band 1": {
"Album A": ["1-Track A1", "1-Track A2", "1-Track A3"],
"Album B": ["1-Track B1", "1-Track B2", "1-Track B3"],
"Album C": ["1-Track C1", "1-Track C2", "1-Track C3"]
},
"Band 2": {
"Album A": ["2-Track A1", "2-Track A2", "2-Track A3"],
"Album B": ["2-Track B1", "2-Track B2", "2-Track B3"],
"Album C": ["2-Track C1", "2-Track C2", "2-Track C3"]
},
"Band 3": {
"Album A": ["3-Track A1", "3-Track A2", "3-Track A3"],
"Album B": ["3-Track B1", "3-Track B2", "3-Track B3"],
"Album C": ["3-Track C1", "3-Track C2", "3-Track C3"]
}
}
import random
def pick_track(music_collection):
# we must pick a key and look that up if we get a dictionary
if isinstance(music_collection, dict):
chosen = music_collection[random.choice(list(music_collection.keys()))]
else:
chosen = random.choice(music_collection)
if isinstance(chosen, str): # it's a string, so it represents a track
return chosen
else: # it's a collection (list or dict) so we have to pick something from inside it
return pick_track(chosen)
def pick_track2(music_collection):
if isinstance(music_collection, dict):
random_key = random.choice(list(music_collection.keys()))
else:
random_key = random.randrange(len(music_collection))
chosen = music_collection[random_key]
if isinstance(chosen, str):
return [random_key, chosen]
else:
return [random_key] + pick_track2(chosen)
for i in range(5):
print(pick_track(music))
for i in range(5):
print("Band: '{}' - Album: '{}' - Track {}: '{}'".format(*pick_track2(music)))
bXVzaWMgPSB7IAoJIkJhbmQgMSI6IHsKCQkiQWxidW0gQSI6IFsiMS1UcmFjayBBMSIsICIxLVRyYWNrIEEyIiwgIjEtVHJhY2sgQTMiXSwKCQkiQWxidW0gQiI6IFsiMS1UcmFjayBCMSIsICIxLVRyYWNrIEIyIiwgIjEtVHJhY2sgQjMiXSwKCQkiQWxidW0gQyI6IFsiMS1UcmFjayBDMSIsICIxLVRyYWNrIEMyIiwgIjEtVHJhY2sgQzMiXQoJfSwKCSJCYW5kIDIiOiB7CgkJIkFsYnVtIEEiOiBbIjItVHJhY2sgQTEiLCAiMi1UcmFjayBBMiIsICIyLVRyYWNrIEEzIl0sCgkJIkFsYnVtIEIiOiBbIjItVHJhY2sgQjEiLCAiMi1UcmFjayBCMiIsICIyLVRyYWNrIEIzIl0sCgkJIkFsYnVtIEMiOiBbIjItVHJhY2sgQzEiLCAiMi1UcmFjayBDMiIsICIyLVRyYWNrIEMzIl0KCX0sCgkiQmFuZCAzIjogewoJCSJBbGJ1bSBBIjogWyIzLVRyYWNrIEExIiwgIjMtVHJhY2sgQTIiLCAiMy1UcmFjayBBMyJdLAoJCSJBbGJ1bSBCIjogWyIzLVRyYWNrIEIxIiwgIjMtVHJhY2sgQjIiLCAiMy1UcmFjayBCMyJdLAoJCSJBbGJ1bSBDIjogWyIzLVRyYWNrIEMxIiwgIjMtVHJhY2sgQzIiLCAiMy1UcmFjayBDMyJdCgl9Cn0KCmltcG9ydCByYW5kb20KZGVmIHBpY2tfdHJhY2sobXVzaWNfY29sbGVjdGlvbik6CgkjIHdlIG11c3QgcGljayBhIGtleSBhbmQgbG9vayB0aGF0IHVwIGlmIHdlIGdldCBhIGRpY3Rpb25hcnkKCWlmIGlzaW5zdGFuY2UobXVzaWNfY29sbGVjdGlvbiwgZGljdCk6CgkJY2hvc2VuID0gbXVzaWNfY29sbGVjdGlvbltyYW5kb20uY2hvaWNlKGxpc3QobXVzaWNfY29sbGVjdGlvbi5rZXlzKCkpKV0KCWVsc2U6CgkJY2hvc2VuID0gcmFuZG9tLmNob2ljZShtdXNpY19jb2xsZWN0aW9uKQoJCglpZiBpc2luc3RhbmNlKGNob3Nlbiwgc3RyKTogICMgaXQncyBhIHN0cmluZywgc28gaXQgcmVwcmVzZW50cyBhIHRyYWNrCgkJcmV0dXJuIGNob3NlbgoJZWxzZTogICMgaXQncyBhIGNvbGxlY3Rpb24gKGxpc3Qgb3IgZGljdCkgc28gd2UgaGF2ZSB0byBwaWNrIHNvbWV0aGluZyBmcm9tIGluc2lkZSBpdAoJCXJldHVybiBwaWNrX3RyYWNrKGNob3NlbikKCQkKCQkKZGVmIHBpY2tfdHJhY2syKG11c2ljX2NvbGxlY3Rpb24pOgoJaWYgaXNpbnN0YW5jZShtdXNpY19jb2xsZWN0aW9uLCBkaWN0KToKCQlyYW5kb21fa2V5ID0gcmFuZG9tLmNob2ljZShsaXN0KG11c2ljX2NvbGxlY3Rpb24ua2V5cygpKSkKCWVsc2U6CgkJcmFuZG9tX2tleSA9IHJhbmRvbS5yYW5kcmFuZ2UobGVuKG11c2ljX2NvbGxlY3Rpb24pKQoJY2hvc2VuID0gbXVzaWNfY29sbGVjdGlvbltyYW5kb21fa2V5XQoJaWYgaXNpbnN0YW5jZShjaG9zZW4sIHN0cik6IAoJCXJldHVybiBbcmFuZG9tX2tleSwgY2hvc2VuXQoJZWxzZToKCQlyZXR1cm4gW3JhbmRvbV9rZXldICsgcGlja190cmFjazIoY2hvc2VuKQogICAgICAgIApmb3IgaSBpbiByYW5nZSg1KToKCXByaW50KHBpY2tfdHJhY2sobXVzaWMpKQoJCmZvciBpIGluIHJhbmdlKDUpOgoJcHJpbnQoIkJhbmQ6ICd7fScgLSBBbGJ1bTogJ3t9JyAtIFRyYWNrIHt9OiAne30nIi5mb3JtYXQoKnBpY2tfdHJhY2syKG11c2ljKSkpCg==