如何从 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]
我正在尝试创建一个长度为 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]