如何在 python 列表中添加“或”?

How do you add an "or" in a python list?

提问人:A. K. M. 提问时间:4/13/2023 更新时间:4/13/2023 访问量:63

问:

对 python 编程相当陌生。
我正在编写一个用于了解美国总统的程序,代码有效,但它非常僵化,如果答案是错误的,我不知道如何添加例外,但在技术上没有错误。 即,如果问题是谁是第 32 任总统?用户应该能够回答富兰克林·罗斯福,或者,富兰克林·罗斯福,或者罗斯福,或者只是罗斯福等等......我的代码设置方式只允许一个答案,有没有办法添加例外,用户可以在不完全回答的情况下获得正确的答案?

import random
def main():
    presidents = {"first":"George Washington", "second":"John Adams","third":"Thomas Jefferson",
                  "fourth":"James Madison", "fifth":"James Monroe", "sixth":"John Quincy Adams",
                  "seventh":"Andrew Jackson", "eighth":"Martin Van Buren", "ninth":"William Henry Harrison",
                  "tenth":"John Tyler","eleventh":"James K. Polk", "twelth":"Zachary Taylor",}
    wrong = []
    print("President Test \n")
    incorrect_answers = False

    while len(presidents)>0:
        pick=random.choice(list(presidents.keys()))
        correct_answer=presidents.get(pick)
        print("Who was the",pick,"President of the United States?"
        answer=input("Your answer?: ")

        if answer.lower()==correct_answer.lower():
            print("That's Correct!\n")
            del presidents[pick]
        else:
            print("That's Incorrect.")
            print("The correct answer is", correct_answer)
            wrong.append(pick)
            incorrect_answers = True

    Print("You missed", len(wrong), "Presidents.\n")
    
    if incorrect_answers:
        print("Here are the ones that you may want to brush up on:/n")
        for each in wrong:
            print(each)
    else:
        print("Perfect!")

main()
   

我希望如果我只是在列表代码中添加一个“或”语句,它会神奇地工作,但我发现它没有。

"eleventh":"James K. Polk" or "James Polk"

也希望它能够使用2个以上的选项,"thirty fifth":"John F. Kennedy" or "John Kennedy" or "JFK"

有没有办法用列表来做到这一点?

谢谢

python 列表 布尔逻辑

评论

5赞 Random Davis 4/13/2023
如果你把它格式化了,那么你就可以检查附加到该键的对象是字符串还是列表,如果它是一个列表,请与运算符进行比较,如果它是一个字符串,则与运算符进行比较。"thirty fifth": ["John F. Kennedy", "John Kennedy", "JFK"]in==
1赞 Shmack 4/13/2023
此外,您可以通过在用户的答案上使用方法使用户的答案不区分大小写,只需确保您的答案也是小写的。lower()
0赞 MattDMo 4/13/2023
请记住,有两位名叫罗斯福的总统——泰迪和富兰克林。
0赞 Pablo Estevez 4/13/2023
您应该使用正确答案列表,并将输入与正确答案的相似性进行比较。这里有几种方法可以 stackoverflow.com/questions/17388213/...
0赞 Kayvan Shah 4/16/2023
您应该考虑将每个名称映射到之后将位置映射到这 3 个字母的 ID

答:

0赞 Code-Apprentice 4/13/2023 #1

不能将“or”添加到列表中,因为列表是数据,“or”是逻辑。但是,您可以通过更改数据结构和对代码逻辑进行小幅更改来解决您的问题。

一种方法是在字典中存储每个键的正确答案列表,而不仅仅是单个字符串。然后,您可以使用运算符来检查输入的答案是否正确,而不是严格相等。in==

如果要允许不区分大小写的比较,则需要编写手动循环,而不是使用运算符。in

评论

0赞 Pablo Estevez 4/13/2023
你可以用小写写每个答案,并降低输入。
0赞 Code-Apprentice 4/13/2023
@PabloEstevez 是的,那也行得通。
1赞 A. K. M. 4/13/2023
感谢您的帮助!我不确定我是否完全理解答案的编程方面,但它现在正在工作,in 运算符是我一直在寻找的。我有很多事情要重新打字。
1赞 Samwise 4/13/2023 #2

将字典中的每个条目都设置为小写可接受答案的列表(或一组或元组):presidents

    "eleventh": ["james k. polk", "james polk"]

然后当你检查答案时,看看它是否是列表的小写版本:in

        correct_answer=presidents.get(pick)
        if answer.lower() in correct_answer:
            print("That's Correct!\n")

如果是混合大小写:correct_answer

    "eleventh": ["James K. Polk", "James Polk"]

您可以通过动态构造小写版本来执行不区分大小写的检查:

        if answer.lower() in [a.lower() for a in correct_answer]:
            print("That's Correct!\n")

评论

0赞 MattDMo 4/13/2023
只有当答案与列表中的整个条目完全匹配时,这才有效。部分匹配(“roosevelt”与列表项“Franklin D. Roosevelt”匹配)将不起作用,即使使用 .请改用 ,假设是一个列表。lower()any([answer.lower() in item.lower() for item in correct_answer])correct_answer
0赞 Samwise 4/13/2023
这不是OP所要求的 - 通过给出单个字母的答案来玩弄这一点非常容易。:)以一种有用的方式进行模糊匹配当然是可行的,但这不是 OP 所要求的。
0赞 MattDMo 4/13/2023
我想,过早的优化,即使正如你所指出的那样,它在逻辑中引入了一个错误或漏洞。我还没想那么远......
0赞 Samwise 4/13/2023
进行模糊匹配的一个非常标准的方法是计算用户答案和正确答案之间的 Levenshtein 距离,并在“足够接近”的地方设置一些阈值。 使这变得非常容易,并且可能还有其他模块使它变得更加容易,但它仍然比这个问题的其余部分要复杂得多。difflib
0赞 MattDMo 4/13/2023
非常正确。快速搜索将我指向 fuzzywuzzy,尽管它似乎自 2020 年以来一直未维护,并且自 2021 年以来一直被替换。您也可以随时直接使用。有很多方法可以给那只猫剥皮。python-Levenshtein