模糊的项目列表 - 打乱顺序,但顺序严格
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
我有一个问题列表,我需要以不同的格式呈现每个问题。
(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