模糊的项目列表 - 打乱顺序,但顺序严格

fuzzy list of items - shuffled, but in strict order

我有一个问题列表,我需要以不同的格式呈现每个问题。

(N 个项目的列表,每个项目有 M 种可能的排列)。

例如

questions = [a, b, c]
permutations = [x, y]
permuted_questions = [(a,x), (b,x), (c,x), (a,y), (b,y), (c,y)]

像上面那样生成一个简单的排列列表很简单。然而, 为了使列表更多 "interesting",我想以某种方式对其进行打乱。

问题是排列列表严格有序。即对于给定的项目 a,排列 (a,x) 应该总是出现在排列 (a,y).

之前

例如

[(a,x), (b,x), (a,y), (c,x), (b,y), (c,y)] 是一个有效的洗牌

[(a,x), (b,y), (a,y), (c,x), (b,x), (c,y)]无效,因为(b,y)出现在(b,x)

之前

有什么建议吗?

您可以简单地将问题随机排列成任意排列,然后通过标记第一个 "a" 问题 x 和第二个 "a" 问题 y 来对列表进行后处理,以此类推其他类型的问题。

例如:

Construct shuffle:
    (a,x), (b,y), (a,y), (c,x), (b,x), (c,y)

Turn into valid shuffle:
    (a,x), (b,x), (a,y), (c,x), (b,y), (c,y)

示例 Python 代码:

from random import shuffle
from itertools import product
from collections import defaultdict
questions = ['a', 'b', 'c']
permutations = ['x', 'y']
Q = list(product(questions,permutations))
shuffle(Q)
D = defaultdict(int) # Keep track of permutation to use for each question
C = []
for q,p in Q:
    C.append( (q,permutations[D[q]]) )
    D[q] += 1
print C