如何实现满足非连续类别约束的多类别实验词汇随机排列?
解决方案
核心逻辑
每次从非上一个类别的剩余词汇中随机选取下一个词,直到所有词汇都被选入序列。这个逻辑简单易懂,不会出现死循环或不符合要求的情况。
Python 实现代码
import random # 定义类别与对应词汇(可直接替换成你实际的词汇) category_words = { 1: ['a', 'b', 'c', 'd'], 2: ['a', 'b', 'c', 'd'], 3: ['a', 'b', 'c', 'd'], 4: ['a', 'b', 'c', 'd'] } # 复制一份数据用于跟踪剩余词汇,避免修改原始数据 remaining = {cat: words.copy() for cat, words in category_words.items()} sequence = [] last_used_category = None # 生成符合要求的序列 while any(len(words) > 0 for words in remaining.values()): # 筛选出可选类别:排除上一个使用的类别,且该类别还有剩余词汇 available_categories = [ cat for cat in remaining if cat != last_used_category and len(remaining[cat]) > 0 ] # 随机选一个类别 selected_cat = random.choice(available_categories) # 从该类别随机选一个词汇 selected_word = random.choice(remaining[selected_cat]) # 加入序列并从剩余列表移除该词汇 sequence.append(selected_word) remaining[selected_cat].remove(selected_word) # 更新上一个使用的类别 last_used_category = selected_cat # 输出结果 print(sequence)
关键说明
remaining字典用于记录每个类别还未使用的词汇,避免重复选取- 每次筛选可选类别时,自动排除上一个使用的类别,确保连续词汇类别不同
- 循环会自动执行到所有16个词汇都被选完,不会出现无法继续的情况(因为4个类别数量相同,永远不会只剩单一类别的词汇)
- 如果需要直观验证类别是否符合要求,可以把词汇改成
(类别编号, 词汇)的形式,比如(1, 'a'),输出时能直接看到类别信息
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

