我正在尝试创建一个长度为6的序列,其中包含从排名组中随机挑选的数字。 序列的第一个元素必须从第一个组中提取,最后一个元素必须从最后一个组中提取。
让新序列被调用" seq"。然后,如果
a = [1,2,3]
b = [9]
c = [5,6]
d = [11,12,4]
seq[0] in a == 1
seq[-1] in d == 1
中间元素必须来自列表a,b,c,d。但是,如果第二个元素是从' a'中随机抽取的,那么第三个元素必须来自后来的' a'元素,或来自b / c / d。类似地,如果第三个元素来自' c,那么其他元素必须来自后面的等级,例如d。这些组按这种方式排名。
现在给出的组数是任意的(最多6组)。序列的长度(len(seq)== 6)是标准的。
每个组中的一个元素必须在最终序列中。不允许重复元素。所有组元素都是唯一的(它们总是在1-12范围内的数字)。
答案 0 :(得分:2)
这个怎么样:
from random import choice, randint
v = [[1, 2, 3],
[9],
[5, 6],
[11, 12, 4]]
def whatever(values, n=6):
first = [choice(values[0])]
last = [choice(values[-1])]
seq = []
k = 0
while len(seq) < n -2:
k = randint(k, len(values)-1)
seq.append(choice(values[k]))
return first + seq + last
print whatever(v, 6)
答案 1 :(得分:2)
set
在这里是一个很好的帮助。
from random import choice
a = [1,2,3]
b = [9]
c = [5,6]
d = [11,12,4]
l=a+b+c+d #ordered candidates
def select():
e=set(l)
for s in (a,b,c,d,e,e): # 4 forced choices and 2 frees.
e.remove(choice(tuple(s))) # sets have no index.
return [x for x in l if x not in e]
10个样本:
>>> for _ in range(10) : print (select())
[1, 9, 5, 11, 12, 4]
[1, 3, 9, 6, 11, 4]
[1, 3, 9, 5, 6, 12]
[1, 2, 9, 6, 11, 4]
[1, 2, 9, 5, 6, 4]
[2, 9, 5, 6, 11, 4]
[1, 2, 9, 5, 11, 12]
[1, 3, 9, 6, 11, 12]
[3, 9, 6, 11, 12, 4]
[1, 2, 9, 5, 12, 4]
答案 2 :(得分:1)
尝试z = [a,b,c,d]
然后对于z中的每个元素e,执行seq.append(e [randint(0,Len(e))]),例如
from random import randint
a=[1,2,3]
b=[4,5,6]
z=[a,b]
print(a[randint(0,len(a))])
f=[]
for e in z:
f.append(e[randint(0,len(e))])
print(f)
或者你可以使用for循环代替a for each并使用手动计数器,这样你就可以有seq [counter] = ...
这不会随机选择这些组。