如何在含嵌套字典与列表的字典中根据track的name获取对应uri
问题
我有一个嵌套字典结构,里面包含多个专辑条目,每个专辑下的name列表和uri列表顺序完全对应。现在需要写一个函数,遍历这个字典,根据给定的曲目名称,返回对应的uri值。比如搜索名称为Marionette时,应返回spotify:track:7K79eftHsp3THzMzKAvdwf。
示例数据如下:
music_data = { 'spotify:album:1fZZFPgIGWwGLGdaBtfTB2': { 'album': ['Bloom'] * 11, 'track_number': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 'id': ['7K79eftHsp3THzMzKAvdwf', '50p5GVTOaUwS24rDGj6Nvv', '1wX0mdaFOVF7QSxh3oMZFu', '6EgjqSpLfGLYAY8xJKS3oI', '21FWZSYUk3HucbogowQkL3', '4I2Xc5VoEHKILATMeRPcAR', '22Fwp9jLBVF25Zt0NKwjgO', '0MoASguy3Rqj6go8yjyXDG', '3yY8DTJHs0rjXi0sgc7oVD', '2ntYoR04fzRYAOoowJzuod', '4AYe20dLcciEY7uhjnxpjp'], 'name': ['Marionette', 'WILDSIDE', 'SAPPY', 'Jackpot', '#Cookie Jar', 'Snap Snap', 'Sayonara', 'Aitai-tai', 'Swimming Pool', "'Cause it's you", 'Color of Love'], 'uri': ['spotify:track:7K79eftHsp3THzMzKAvdwf', 'spotify:track:50p5GVTOaUwS24rDGj6Nvv', 'spotify:track:1wX0mdaFOVF7QSxh3oMZFu', 'spotify:track:6EgjqSpLfGLYAY8xJKS3oI', 'spotify:track:21FWZSYUk3HucbogowQkL3', 'spotify:track:4I2Xc5VoEHKILATMeRPcAR', 'spotify:track:22Fwp9jLBVF25Zt0NKwjgO', 'spotify:track:0MoASguy3Rqj6go8yjyXDG', 'spotify:track:3yY8DTJHs0rjXi0sgc7oVD', 'spotify:track:2ntYoR04fzRYAOoowJzuod', 'spotify:track:4AYe20dLcciEY7uhjnxpjp'] }, 'spotify:album:3rVtm00UfbuzWOewdm4iYM': { 'album': ['‘The ReVe Festival’ Finale'] * 16, 'track_number': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 'id': ['3CYH422oy1cZNoo0GTG1TK', '2iYnEfKsAsE86Yb9mS4b3E', '2m9K7KlDOQ0NXk9xBpkuoZ', '5vdqSjUj9JZsAHdr02Vygk', '1wpAS4Jm9ElkOJjnyDX4Tm', '3q21kVfUIdkzqYpzBCbojN', '12okmCNziVZkDIcEOx0SD9', '2KqYLFNTX2HXzYH4bucBKa', '0HFa5Rr2x5iwqIvGTMqif6', '7gs7h249FMYC3U02BimoD6', '3lZHJ90cpbtLCyJNzL39Pb', '0tHkBl71ZHXaFdc0sNGQHz', '65ZHlbTuPrZggbmYCVjPL4', '782QoB4jJ7hEVJmkYzVrRE', '2cvi3IRTibXzmAm4f8P2HP', '1O7qPyMtudzP3APaOT2OTH'], 'name': ['Psycho', 'In & Out', 'Remember Forever', 'Eyes Locked, Hands Locked', 'Ladies Night', "Jumpin'", 'Love Is The Way', 'Carpool', 'Umpah Umpah', 'LP', 'Parade', 'Bing Bing', 'Milkshake', 'Sunny Side Up!', 'Zimzalabim', 'La Rouge - Special Track'], 'uri': ['spotify:track:3CYH422oy1cZNoo0GTG1TK', 'spotify:track:2iYnEfKsAsE86Yb9mS4b3E', 'spotify:track:2m9K7KlDOQ0NXk9xBpkuoZ', 'spotify:track:5vdqSjUj9JZsAHdr02Vygk', 'spotify:track:1wpAS4Jm9ElkOJjnyDX4Tm', 'spotify:track:3q21kVfUIdkzqYpzBCbojN', 'spotify:track:12okmCNziVZkDIcEOx0SD9', 'spotify:track:2KqYLFNTX2HXzYH4bucBKa', 'spotify:track:0HFa5Rr2x5iwqIvGTMqif6', 'spotify:track:7gs7h249FMYC3U02BimoD6', 'spotify:track:3lZHJ90cpbtLCyJNzL39Pb', 'spotify:track:0tHkBl71ZHXaFdc0sNGQHz', 'spotify:track:65ZHlbTuPrZggbmYCVjPL4', 'spotify:track:782QoB4jJ7hEVJmkYzVrRE', 'spotify:track:2cvi3IRTibXzmAm4f8P2HP', 'spotify:track:1O7qPyMtudzP3APaOT2OTH'] } }
解决方案
核心思路是利用name和uri列表的索引对应关系:找到目标名称在name列表中的位置,再取uri列表相同位置的值。
实现函数
def find_track_uri(music_data, track_name): # 遍历每个专辑 for album in music_data.values(): track_names = album.get('name', []) track_uris = album.get('uri', []) # 检查两个列表长度一致(避免数据异常) if len(track_names) != len(track_uris): continue # 查找目标名称的索引 try: index = track_names.index(track_name) return track_uris[index] except ValueError: # 当前专辑没找到,继续下一个 continue # 所有专辑都没找到,返回None或自定义提示 return None
使用示例
# 搜索'Marionette' print(find_track_uri(music_data, 'Marionette')) # 输出: spotify:track:7K79eftHsp3THzMzKAvdwf # 搜索'Psycho' print(find_track_uri(music_data, 'Psycho')) # 输出: spotify:track:3CYH422oy1cZNoo0GTG1TK
扩展说明
- 如果存在同名曲目,函数会返回第一个匹配的uri;若需要返回所有匹配结果,可以修改函数收集所有符合条件的uri。
- 加入了列表长度检查,避免因数据异常导致索引错误。
- 未找到目标曲目时返回
None,可根据需求改为抛出异常或返回提示字符串。
内容的提问来源于stack exchange,提问作者Precog
相关产品推荐
相关产品推荐

