【问题标题】:Fuzzy finding poker flop in Python在 Python 中模糊查找扑克翻牌
【发布时间】:2020-03-11 06:26:01
【问题描述】:

给定一个list 的扑克翻牌和一个str 作为目标:

target = '5c6d2d'
flops = ['5s4d3s', '6s4d2d', '6s5d3s', '6s4s2d']

我正在尝试找到与目标最接近的匹配项。当前使用fuzzywuzzy.process.extract,但有时这不会返回所需的匹配项。而且(更重要的是)它没有正确考虑排名,因为面卡的排名是用字母表示的,所以9c9d9s 也更类似于2c2d2h,而不是TcTdTh。有没有一种巧妙的方法来解析target flop 以使用简单的算法来做到这一点?或者最好尝试为此训练一个机器学习模型?

如果相关的话,请注意:我的fuzzywuzzy 使用纯 python SequenceMatcher,因为我没有权限为 python-Levenshtein 安装 Visual Studio 14。

编辑:澄清一下,最接近的匹配是指翻牌纹理方面最接近的,即战略上最相似的翻牌(我知道这有点困难)。我最初给出的示例列表实际上并不太清楚,所以这里再举一个 fuzzywuzzy 的示例:

>>> target = '8c8h5s'
>>> flops = ['2d2s6c', '7c5s5d', '8s8d7h', '4h3s3d'] 
>>> matches = process.extract(target, flops)
>>> print(matches)
[('7c5s5d', 50), ('8s8d7h', 50), ('4h3s3d', 33), ('2d2s6c', 17)]

就我而言,'8s8d7h' 的得分应该比'7c5s5d' 好。所以军衔的匹配要优先于花色的匹配。

【问题讨论】:

    标签: python python-3.x fuzzy-search fuzzywuzzy


    【解决方案1】:

    最接近的匹配是什么意思?你的意思是最少数量的不同字符? 如果是这样,您可以这样做:

    def find_closest(main_flop, flops):
      best_match = ''
      matching_characters = 0
      for flop in flops:
          for i, character in enumerate(flop):
              if main_flop[i] == character:
                  matching_characters += 1
          if matching characters > max_matching:
              best_match = flop
      return best_match
    

    另一方面,如果你想找到“最接近”的翻牌,就其与所有范围手牌的胜率相似程度而言,那么你将不得不构建一些非常复杂的东西,或者使用像@这样的库987654321@或https://poker.readthedocs.io/en/latest/

    【讨论】:

    • 感谢您的建议。我试图在编辑中更多地澄清我的问题。我不是在寻找接近公平的翻牌,而是寻找结构上的相似性。例如。 As7s5c 应该更好地匹配带有两个花色的翻牌,而不是带有一个或三个花色的翻牌。但是,我希望优先考虑排名的接近。
    • 我认为此时您应该创建自己的评分函数,然后使用它进行排序。扑克翻牌很难定义“相同性”,您必须编写自己的函数来输出每次翻牌的“分数”。然后你将使用它进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多