【问题标题】:Testing a list against a list根据列表测试列表
【发布时间】:2023-03-15 18:45:01
【问题描述】:

我在这里知道这个帖子:Testing user input against a list in python

但是,作为新人(在这里和编程时),我不确定是否可以碰到一个 3 年前的帖子,或者我是否需要制作一个新帖子。我为此道歉。

我也检查了文档,但阅读后我不完全理解,为什么这段代码在运行后不会打印“不在选择中”这一行。

我想这样做,以便根据列表“选择”测试用户输入。 (假设用户只输入 a 到 z 之间的小写字母)

我尝试了“a”或“test”之类的输入,但“不在选择中”仍然打印出来,好像它无法识别输入一样。

有人可以帮我解决这个问题吗?我正在尝试制作一个刽子手游戏:)

selection = list('abcdefghijklmnopqrstuvwxyz')
gameword = []

user_input = input('input a gameword> ') 
gameword = list(user_input) 
if gameword not in selection:
    print('not in selection')

编辑++

我意识到我需要所有这些:“islower, isalpha, isdigit

问题是,我似乎无法将所有这些结合起来并使其正常工作。或者想出一个更合适的方法来做到这一点。

这是我在意识到需要将它们全部组合起来之前得到的结果:

while True:                                      # loop to get the user input
user_input = input('input> ')                    # store input in 'user_input'
gameword = list(user_input)                      # list inside gameword
if user_input == 'q':                            # loop ends when q is entered
    break                                        # break statement
if len(user_input) <= 4 or len(user_input) >= 9: # checks the length of the string input 
    print('5 to 8 letters ')                     # prints the restriction on screen
for i in gameword:                               #
    if i.islower() not in selection              # checks if lowercase are used
        print('only low letters please')         # prints the restriction on screen
for i in gameword:                               #
    if i.isalpha() not in selection:             # check if is alphabet letter are used
        print('only letters')                    # prints the restriction onscreen
for i in gameword:                               #
    if i.isdigit() in selection:                 # checks if digits are in word list
        print('no numbers plz')                  #

`

但它会一直打印“请只用小写字母”,而不是只检查条件然后打印“错误输入消息”,然后在游戏开始前再次尝试获取输入...

我希望得到更多关于此的建议 :)

【问题讨论】:

  • 您是否尝试将某些输入的字符与选择的字符进行匹配?
  • 我正在尝试获取用户输入,然后检查输入的所有字母是否至少与选择中的任何一个字母匹配。但我想要限制,我正在努力将它们组合起来(islower、isalpha、isdigit)。也许我需要一个一个地问信,因为我从克劳迪乌的回答中看到了。我仍然想知道是否有办法不这样做。

标签: python python-3.2


【解决方案1】:

selection 包含一个字符列表:['a', 'b', ..., 'z']

gameword 是用户输入的任何内容的列表。如果用户输入a,那么gameword 就是['a']

然后你问gameword是否在selection中,即selection是否包含['a']。但是,它不包含 'a',字符,而不是 ['a'],其中包含一个元素的列表。

我猜你希望用户只输入下一个字母来猜测?试试这个:

selection = list('abcdefghijklmnopqrstuvwxyz')
next_letter = input('input a letter> ') 
if len(next_letter) != 1:
    print('Not a letter')
elif next_letter not in selection:
    print('not in selection')

【讨论】:

  • 他好像是新来的。您可能应该编辑您的帖子以建议他可以通过简单地跳过他将游戏词列为列表的行来避免['a']'a' 难题。此外,如果选择是一个列表,它将仅对单个(小写)字母有效,而不是总字数
  • @Sabyasachi:我想。我打算添加它,然后没有,但现在我做到了!
  • 不管怎样,我很困惑他为什么需要这个(为了他的刽子手游戏)。您是否认为他可能会将其混淆为应该检查“dsasdsasddsa”是否是有效词的东西?
  • @Sabyasachi:也许吧。我不确定这就是我一开始没有提供解决方案的原因 - 因为,解决方案到底是什么?
  • 感谢您的回答和指定,这很有帮助!我需要它,因为我想让它让某人先输入一个“游戏词”,然后游戏使用该词来玩。
【解决方案2】:

那么说gamewordhello。现在,如果程序在abcdefghijklmnopqrstuvwxyz 中搜索列表['h', 'e', 'l', 'l', 'o'],它不会找到它,因为整个单词并没有作为一个整体出现。您可能希望这样更改您的代码:

selection = list('abcdefghijklmnopqrstuvwxyz')
gameword = []

user_input = input('input a gameword> ') 
gameword = list(user_input) 
for k in gameword:
    if k.lower() not in selection:
        print('not in selection') 

您正在检查整个列表是否在所选内容中,而事实并非如此。解决此问题的方法是使用 for 循环遍历 selection 中的每个单独字符,而不是一次遍历每个字符。

编辑:这是第二组代码,回答您的第二个问题:

selection = list('abcdefghijklmnopqrstuvwxyz')
gameword = []

user_input = input('input a gameword> ')
user_input = str(user_input)
gameword = list(user_input)
for k in gameword:
    if k.isdigit() == True:
        print('no digits please')
        break
    if k.isalpha() == False:
        print('only alphabets please')
        break
    if k.islower() == False:
        print('only lowercase please')
        break
    if k not in selection:
        print('not in selection')
        break

我希望我能正确理解您的要求:D

【讨论】:

  • 太棒了 :) 记得接受并 +1 一个在 15 分钟后解决您的问题的答案
  • @user3375785 你想让它对像“adsdsaasdd”这样的输入说“不在选择中”吗?
  • 更简单的方法是gameword = input('input a gameword&gt; '), if not gameword.isalpha(): print('gameword must be only letters')
  • 尽我所能回答:)
【解决方案3】:

尝试使用类似的东西。

words = 'abcdefghijklmnopqrstuvwxyz'

guess = raw_input('input a gameword> ')
if guess not in words:
    print('not in selection')

【讨论】:

  • 你的答案是唯一没有投票的答案,但它是解决这个问题的正确方法。让我纠正一下……
【解决方案4】:

听起来您想验证 user_input 字符串是否仅包含字母字符 (a-z)。为此,您可以使用isalpha() 字符串方法。

if not gameword.isalpha():
    print("Not all alphabetical characters")

要检查字符串是否全部小写,也可以使用string.islower()方法。

if not gameword.islower():
    print("Not all lower case characters")

要将字符串转换为全小写,可以使用 string.lower() 方法。

【讨论】:

  • 乐于提供帮助 - 如果您发现除了已接受的答案之外还有其他有用的回复,您仍然可以使用每个回复左侧的箭头对其进行投票。见meta.stackexchange.com/questions/5234/…
  • @user3375785 :D 现在可以了
【解决方案5】:

您似乎正在单项列表中搜索字符串。 对于这种类型的游戏,我会使用一个元组,因为每个输入都是唯一的。

selection = ('a','b','c','d')
gameword = []
....... //input game words
for word in gameword:
    if word not in selection:
        print('not in selection')

【讨论】:

  • 如果每个输入都是唯一的,为什么不使用set
  • 一组是正确的。如果游戏数据是静态的,我应该选择不可变的。
【解决方案6】:

你说你正在构建一个刽子手游戏,所以你想检查userinput 是否是一个有效的英文单词?如果是这样,那么这将不起作用。您需要下载一个单词表。有大量可用的开源资源。

在您的主文件夹中将文本文件另存为“words.txt”。然后,你可以这样做,

>>>s=set(i for i in open('words.txt'))
>>>userinput=input('Enter your word')
>>>if userinput not in s:
        print('Not a valid word')

这里有一个link,你可以试试。

【讨论】:

  • 我不知道这个方法,我不认为我会在这个游戏中使用它,但我可能会在将来使用它。谢谢
  • @user3375785 只是出于好奇,你到底想用这个做什么?我的意思是这个问题将如何融入你的刽子手游戏?
  • @Sabyasachi 似乎正在尝试在用户猜测字母时验证用户输入。确保这封信实际上是一封信,而不是别的什么。
  • 我需要它,因为我想让它让某人首先输入一个“游戏词”,然后游戏使用该词来玩。我也想参加诅咒游戏,但还没有:P
【解决方案7】:

请求输入,然后使用一堆if...else语句来检查islower(), isalpha(),等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2021-06-17
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多