使用lower()方法(或类似)检查输入是否在列表中?



我正在做一个项目,我有一个项目列表,其中一些是大写的(列表目前不完整,因为调试)。我需要检查用户的输入是否在列表中,我希望它不区分大小写。我尝试使用lower()方法,但它不适用于列表。是否有一种方法可以获得与此代码上下文中相同的效果?

itemList = ['Dirt', 'Oak Log']
def takeName():
itemName = ''
while itemName == '':
itemName = input('What Minecraft item would you like the crafting recipe for?n')

try:
itemName = int(itemName)
except ValueError:
if itemName.lower() not in itemList.lower():
print('Not a valid Minecraft item name or ID!n')
itemName = ''
elif itemName.lower() in itemList.lower():
itemName = itemList.lower().index(itemName)

return itemName

可以使用列表推导式将列表项转换为小写。例如:

itemList_lower = [x.lower() for x in itemList]

然后在代码中尝试使用itemList.lower()的地方使用itemList_lower

不幸的是,没有内置方法将列表的所有字符串都设置为小写。
如果你仔细想想,这将是不一致的开发,因为在Python中一个列表可以存储不同类型的对象,这将是不连贯的数据结构本身的目的。
所以,你应该设计和开发一个算法来做到这一点。

不用担心,有"列表理解"它快速、简单、优雅,事实上:

lowered_list = [item.lower() for item in itemList]

现在,你有了一个新列表名为"lowered_list"它包含您存储在另一个列表中的所有字符串,但以小写形式。很酷,不是吗?

您不能在列表上使用字符串函数,以便将此函数应用于所有列表项。您必须使用列表推导式或map函数来应用该函数。

使用列表推导式:

lowerItemList = [item.lower() for item in itemList]

列表推导式基本上是一种更有效的方法,可以更简洁地编写短for循环。上面的代码将与下面的代码相同:

lowerItemList = []
for item in itemList:
itemLower = item.lower()
loserItemList.append(itemLower)

另一种方法是使用map函数。该函数将函数应用于可迭代对象的所有项。

lowerItemList = list(map(str.lower, itemList))

由于这是一个有点复杂的例子,下面是它的工作原理:

我们正在使用map函数将str.lower函数应用于我们的项目列表。调用str.lower(string)实际上与调用string.lower()相同。Python已经为你完成了。

因此,我们的结果将包含一个map对象,其中包含所有字符串的降低形式。我们需要将这个map对象转换为list对象,因为map对象是一个迭代器,它不支持索引和许多list类的方法。

您想要一个不区分大小写的查找,但是您想返回一个在itemList中定义的值。因此:

itemList = ['Dirt', 'Oak Log']
itemListLower = [e.lower() for e in itemList] # normal form
def takeName():
while True:
itemName = input('What Minecraft item would you like the crafting recipe for? ')
try:
idx = itemListLower.index(itemName.lower()) # do lookup in the normal form
# as the two lists are aligned you can then return the value from the original list using the same index
return itemList[idx]
except ValueError:
print(f'{itemName} is not a valid selection') # user will be promted to re-enter
print(takeName())

输出:

What Minecraft item would you like the crafting recipe for? banana
banana is not a valid selection
What Minecraft item would you like the crafting recipe for? oak log
Oak Log

最新更新