根据 Python 中的分数生成随机元组组合
Generate random tuple combination based on their score in Python
我正在尝试创建一个 python 程序,我有 4 个元组列表,我想创建不同的 'words',每个字母都有自己的出现概率,我也想单词要独一无二。
我首先尝试通过为每个字母分配概率来创建,这使用 numpy.random.choice()
函数起作用。
现在我想换个角度看问题。我给每个字母(每个元组的第二部分)加上一个权重(或分数),所以我创建的每个单词都有一个分数,在这里:从 4 到 16。(见下面的 4 个元组列表,这是我的一个例子使用,4 个列表不同)
liste1 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('M',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('G',4), ('J',4)]
liste2 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('L',2), ('N',2), ('Z',2), ('Y',2), ('R',3), ('E',3), ('P',3), ('F',4), ('X',4)]
liste3 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('Q',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('H',4), ('J',4)]
liste4 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('M',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('S',4), ('J',4)]
我想做的是告诉我的程序我想要 x 个分数为 16 的单词,然后程序将随机创建 x 个具有这个分数的唯一单词,然后也为分数为15、14 等...
我不知道该怎么做,我知道这是一个非常具体的需求,所以如果有人能给我一个答案,我会很高兴。
感谢您的宝贵时间!
嗨,我从上面的代码中了解到答案可能是这样的
,你可以在每个列表上有一个循环 运行 并且 if 语句将检查条件这里是一个例子
list1 = [("a",1),("b",2)....,("z", 16)]
wordlist = []
for tuple_1 in list1:
(word,score) = tuple_1.split(",")
if score == userinput #you can define that :
wordlist.append(word)
else:
pass
# do random.choice() here
注意如有错误请告知
尝试:
import random
liste1 = [
("A", 1),
("E", 1),
("I", 1),
("O", 1),
("U", 1),
("M", 2),
("N", 2),
("B", 2),
("Y", 2),
("R", 3),
("E", 3),
("T", 3),
("G", 4),
("J", 4),
]
def get_words(lst, n, target):
def get_combinations(candidates):
res = []
def fn(arr, start):
s = sum(arr)
if s == target:
res.append(arr[:])
return
if s > target:
return
for i in range(start, len(candidates)):
arr.append(candidates[i])
fn(arr, i)
arr.pop()
fn([], 0)
return res
tmp = {}
for ch, v in lst:
tmp.setdefault(v, []).append(ch)
all_comb = get_combinations(list(tmp))
res = []
for _ in range(n):
while True:
s = ""
comb = random.choice(all_comb)
random.shuffle(comb)
for v in comb:
s += random.choice(tmp[v])
if s not in res:
res.append(s)
break
return res
print(get_words(liste1, 10, 16))
这会从 liste1
中打印出 10 个随机单词,这些单词的字符总和为 16(例如):
[
"UNINONMBAM",
"TMYRNYY",
"UOUUAEOUUUIAEOAA",
"JIJMJA",
"MNNJJN",
"OIMAIIGOJ",
"TTNBYMY",
"EIAAIUUAMIEOI",
"IEUAOJENUU",
"BBGJENI",
]
我正在尝试创建一个 python 程序,我有 4 个元组列表,我想创建不同的 'words',每个字母都有自己的出现概率,我也想单词要独一无二。
我首先尝试通过为每个字母分配概率来创建,这使用 numpy.random.choice()
函数起作用。
现在我想换个角度看问题。我给每个字母(每个元组的第二部分)加上一个权重(或分数),所以我创建的每个单词都有一个分数,在这里:从 4 到 16。(见下面的 4 个元组列表,这是我的一个例子使用,4 个列表不同)
liste1 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('M',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('G',4), ('J',4)]
liste2 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('L',2), ('N',2), ('Z',2), ('Y',2), ('R',3), ('E',3), ('P',3), ('F',4), ('X',4)]
liste3 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('Q',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('H',4), ('J',4)]
liste4 = [('A',1), ('E',1), ('I',1), ('O',1), ('U',1), ('M',2), ('N',2), ('B',2), ('Y',2), ('R',3), ('E',3), ('T',3), ('S',4), ('J',4)]
我想做的是告诉我的程序我想要 x 个分数为 16 的单词,然后程序将随机创建 x 个具有这个分数的唯一单词,然后也为分数为15、14 等...
我不知道该怎么做,我知道这是一个非常具体的需求,所以如果有人能给我一个答案,我会很高兴。
感谢您的宝贵时间!
嗨,我从上面的代码中了解到答案可能是这样的 ,你可以在每个列表上有一个循环 运行 并且 if 语句将检查条件这里是一个例子
list1 = [("a",1),("b",2)....,("z", 16)]
wordlist = []
for tuple_1 in list1:
(word,score) = tuple_1.split(",")
if score == userinput #you can define that :
wordlist.append(word)
else:
pass
# do random.choice() here
注意如有错误请告知
尝试:
import random
liste1 = [
("A", 1),
("E", 1),
("I", 1),
("O", 1),
("U", 1),
("M", 2),
("N", 2),
("B", 2),
("Y", 2),
("R", 3),
("E", 3),
("T", 3),
("G", 4),
("J", 4),
]
def get_words(lst, n, target):
def get_combinations(candidates):
res = []
def fn(arr, start):
s = sum(arr)
if s == target:
res.append(arr[:])
return
if s > target:
return
for i in range(start, len(candidates)):
arr.append(candidates[i])
fn(arr, i)
arr.pop()
fn([], 0)
return res
tmp = {}
for ch, v in lst:
tmp.setdefault(v, []).append(ch)
all_comb = get_combinations(list(tmp))
res = []
for _ in range(n):
while True:
s = ""
comb = random.choice(all_comb)
random.shuffle(comb)
for v in comb:
s += random.choice(tmp[v])
if s not in res:
res.append(s)
break
return res
print(get_words(liste1, 10, 16))
这会从 liste1
中打印出 10 个随机单词,这些单词的字符总和为 16(例如):
[
"UNINONMBAM",
"TMYRNYY",
"UOUUAEOUUUIAEOAA",
"JIJMJA",
"MNNJJN",
"OIMAIIGOJ",
"TTNBYMY",
"EIAAIUUAMIEOI",
"IEUAOJENUU",
"BBGJENI",
]