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

时间:2016-02-04 15:45:51

标签: python algorithm random ranking

我正在尝试创建一个长度为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范围内的数字)。

3 个答案:

答案 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] = ...

这不会随机选择这些组。