我正在做一个项目,我有一个项目列表,其中一些是大写的(列表目前不完整,因为调试)。我需要检查用户的输入是否在列表中,我希望它不区分大小写。我尝试使用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