import random
import difflib
from itertools import cycle
def group_songs_by_similarity(songs, threshold=0.6):
groups = []
for song in songs:
placed = False
for group in groups:
if any(difflib.SequenceMatcher(None, song, member).ratio() > threshold for member in group):
group.append(song)
placed = True
break
if not placed:
groups.append([song])
return groups
def shuffle_and_merge(groups):
shuffled_groups = [random.sample(group, len(group)) for group in groups]
merged_list = []
group_iters = cycle(shuffled_groups)
while any(shuffled_groups):
for group in group_iters:
if group:
merged_list.append(group.pop(0))
return merged_list
# 示例歌曲列表
songs = ["SongA1", "SongA2", "SongB1", "SongB2", "SongC1", "SongC2", "SongD1", "SongD2"]
# 分组并打乱
groups = group_songs_by_similarity(songs)
shuffled_songs = shuffle_and_merge(groups)
print(shuffled_songs)
可以考虑采用分组打乱实现,尽量避免歌名相似度高的不连续。