TypeError: unhashable type: list in len(re.findall())

时间:2021-05-27 03:45:27

标签: python

我正在为学校作业编写一个非常简单的 KENO 模拟游戏。 非常基础的 Python 知识。 我收到一个 TypeError: unhashable type: list

如果相关,这是我的完整代码:(下面的特定部分)

import random
from random import randrange
import sys
import re
def keno_sim():

    acceptable_values = list(range(1, 40))    
    number_no = int(input("How many numbers would you like to input? (MIN: 1 MAX: 40): "))
    if number_no in acceptable_values:
        print ("Pick your numbers, (between 1-80), seperated by commas ")
        answer = input("> ").split(",")
    else:
        print ("Please choose a number that's 1-40")

    random_number = random.sample(range(1, 80), number_no)
    print ("Your numbers are:",answer)
    print ("The generated numbers are:",random_number)
    matches = len(re.findall(answer, random_number))

    if matches > 0.5 * random_number:
        print ("You win!")
        print ("You had",matches,"matches!")

    elif matches < 0.5 * random_number:
        print ("Close! but wrong number!")
        print ("You had",matches,"matches!")

print("This is KENO\n")
print("GENERAL RULES:\nPick how many numbers you’d like to play, ranging from 1 to 40. Same numbers are drawn from the 80 available on the Keno game grid, if you match more than half of them, you win!")
keno_sim()

again = str(input("Do you want to play again (type yes or no): "))
if again == ["yes", "Yes", "yess", "y","ye", "yea"]:
    keno_sim()
else:
    print ("Thanks for playing ,name, !")
    sys.exit(0)

特定部分:

    matches = len(re.findall(answer, random_number))

    if matches > 0.5 * random_number:
        print ("You win!")
        print ("You had",matches,"matches!")

    elif matches < 0.5 * random_number:
        print ("Close! but wrong number!")
        print ("You had",matches,"matches!")

如果可能,请给出具体的修复或示例

2 个答案:

答案 0 :(得分:0)

re.findall 需要两个 str ,但是您给了它两个 list,并且列表是不可散列的,因为它们是可变的。而不是

matches = len(re.findall(answer, random_number))

尝试类似的东西

matches = len(set(answer).intersection(random_number))

不相关,但您也可能想做类似的事情

answer = [int(x) for x in input("> ").split(",")]

if matches > 0.5 * len(random_number):
    ...
elif matches < 0.5 * len(random_number):
    ...

答案 1 :(得分:0)

're.findall()' 与正则表达式相关,它不适用于列表,仅适用于字符串。在您的情况下,您可以使用集合查找匹配项:

  1. 将您的列表转换为集合

    set1 = set([int(item) for item in answer]

    set2 = set(random_number)

  2. 找到它们的交点:

    intr = set1.intersection(set2)

  3. 求交点的长度:

    matches = len(intr)