【问题标题】:Generate random tuple combination based on their score in Python根据 Python 中的分数生成随机元组组合
【发布时间】:2021-09-26 12:02:19
【问题描述】:

我正在尝试创建一个 python 程序,我有 4 个元组列表,我想创建不同的“单词”,每个字母都有自己出现的概率,我也希望单词是唯一的。

我首先尝试通过为每个字母分配概率来创建,使用 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等...

我不知道该怎么做,我知道这是一个非常具体的要求,所以如果有人能给我答案,我会很高兴。

感谢您的宝贵时间!

【问题讨论】:

    标签: python list numpy random tuples


    【解决方案1】:

    试试:

    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",
    ]
    

    【讨论】:

      【解决方案2】:

      嗨,我从上面的代码中理解 ans 可能是这样的 ,您可以在每个列表上运行一个循环,并且 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
      

      注意如果有错误请告知

      【讨论】:

      • 感谢您的快速回复,我想我的问题不清楚,我想生成一个 4 字母的单词,例如每个字母都有一个分数(从 1 到 4),结果在这个词的分数从 4 到 16。例如,如果 A=1point B=2points 和 Y=4points,那么单词 ABAY=8points 我想要做的是告诉我的程序我想要多少个独特的 8 点单词,然后它会给我随机的独特可能性,如果我仍然不清楚,请告诉我。最后程序总是会创建4个字母的单词,我只是告诉他我想要的最终分数以及我想要多少单词
      猜你喜欢
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2016-04-29
      • 2016-04-27
      • 1970-01-01
      相关资源
      最近更新 更多