项目的模糊列表 - 洗牌,但严格按顺序排列

时间:2015-12-03 10:01:00

标签: algorithm sorting random shuffle

我有一份问题清单,我需要以不同的格式提出每个问题。

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

e.g。

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

如上所述生成简单的排列列表非常简单。然而, 为了使列表更加有趣",我想以某种方式改变它。

问题是排列列表严格按排序。即对于给定项目a,排列(a,x)应始终出现在排列(a,y)之前。

e.g。

[(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)

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你可以简单地将问题混合到任何排列中,然后通过标记第一个“a”问题x和第二个“a”问题y来对列表进行后处理,依此类推其他类型的问题。

e.g:

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