如何从 python 中的排名组中随机选择数字,以创建特定长度的列表

How to randomly pick numbers from ranked groups in python, to create a list of specific length

我正在尝试创建一个长度为 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.The 组以这种方式排名。

现在给出的组数是任意的(最多6组)。序列的长度 ( len(seq) == 6 ) 是标准的。

来自 each 组的一个元素必须在最终序列中。元素的重复是不允许的。所有组元素都是唯一的(并且总是1-12范围内的数字)。

这个怎么样:

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)

尝试 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 循环而不是 for each 并使用手动计数器,这样您就可以拥有 seq[counter]=...

虽然这不会随机选择组。

你有四个强制选择,然后两个自由选择。 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]