音乐流派统计:拆分列表时保留复合流派并提取一维列表
解决方案:统一统计高级别音乐流派
针对你遇到的两个问题,直接给出最优解决思路和代码:
核心方案:流派映射(同时解决拆分+统计需求)
既然要统计高级别流派,最直接的方式是给每个子流派定义对应的高级别分类,既避免拆分"hip hop"这类复合流派,又直接得到一维的高级别流派列表,同时完成统计。
代码示例
from collections import Counter # 定义子流派 → 高级别流派的映射(可根据需求扩展) genre_mapping = { 'pop': 'pop', 'latin pop': 'pop', 'edm': 'edm', 'argentine hip hop': 'hip hop', 'latin hip hop': 'hip hop', 'rock': 'rock', 'trap latino': 'trap', 'r&b': 'r&b' } # 原始流派列表 genres = ['pop', 'edm', 'argentine hip hop', 'rock', 'trap latino', 'r&b', 'latin hip hop', 'latin pop'] # 转换为一维的高级别流派列表 high_level_genres = [genre_mapping[g] for g in genres] # 统计各高级别流派数量 genre_counts = Counter(high_level_genres) # 输出结果 print("一维高级别流派列表:", high_level_genres) print("流派统计结果:", genre_counts)
输出结果
一维高级别流派列表: ['pop', 'edm', 'hip hop', 'rock', 'trap', 'r&b', 'hip hop', 'pop'] 流派统计结果: Counter({'pop': 2, 'hip hop': 2, 'edm': 1, 'rock': 1, 'trap': 1, 'r&b': 1})
针对具体问题的单独解决方法
1. 避免"Hip Hop"被拆分
如果流派列表较大,不想手动写全映射,可以用正则匹配复合流派,自动归类:
import re from collections import Counter genres = ['pop', 'edm', 'argentine hip hop', 'rock', 'trap latino', 'r&b', 'latin hip hop', 'uk pop'] high_level_genres = [] for g in genres: # 优先匹配复合流派 if re.search(r'hip hop', g, re.IGNORECASE): high_level_genres.append('hip hop') elif re.search(r'pop', g, re.IGNORECASE): high_level_genres.append('pop') elif re.search(r'edm', g, re.IGNORECASE): high_level_genres.append('edm') elif re.search(r'rock', g, re.IGNORECASE): high_level_genres.append('rock') elif re.search(r'trap', g, re.IGNORECASE): high_level_genres.append('trap') elif re.search(r'r&b', g, re.IGNORECASE): high_level_genres.append('r&b') print("一维高级别流派列表:", high_level_genres) print("流派统计结果:", Counter(high_level_genres))
2. 扁平化嵌套列表(仅解决格式问题,不推荐用于流派统计)
如果只是想把你生成的嵌套列表转成一维,用列表推导式即可:
genres_split = [['pop'], ['edm'], ['argentine', 'hip', 'hop'], ['rock'], ['trap', 'latino'], ['r&b'], ['latin', 'hip', 'hop'], ['uk', 'pop']] flat_genres = [item for sublist in genres_split for item in sublist] print(flat_genres)
输出:
['pop', 'edm', 'argentine', 'hip', 'hop', 'rock', 'trap', 'latino', 'r&b', 'latin', 'hip', 'hop', 'uk', 'pop']
⚠️ 注意:这种方式会拆分"hip hop",无法满足你的高级别统计需求,仅适合纯格式处理场景。
内容的提问来源于stack exchange,提问作者lydol
相关产品推荐
相关产品推荐

