将 casefold 与字典一起使用时遇到问题

Trouble using casefold with dictionary

提问人:user2981194 提问时间:11/15/2023 更新时间:11/15/2023 访问量:34

问:

我正在尝试比较字典中所有字符串的项目并忽略大小写。下面是我尝试使用它的一个例子 - 它不起作用,但我想发生的是打印出 Ad、aB 和 RD。相反,当它到达“ab”时,我收到一个键错误,因为我没有正确使用语法。关于我如何做到这一点的任何帮助将不胜感激。

test_vals = ['ad', 'ab', 'rD']
test_dict = {'ad': 'Ad', 'Ab': 'aB', 'RD': 'RD'}
for item in test_vals:
    print(test_dict[item.casefold()])
Python 字典 大小写折叠

评论

0赞 John Gordon 11/15/2023
casefold()将字符串转换为小写。因此,您的循环会尝试访问字典中的键“ad”、“ab”和“rd”。但是“ad”和“rd”在字典中不存在。

答:

0赞 ShadowRanger 11/15/2023 #1

如果您通过折叠大小写来查找钥匙,则最好将钥匙折叠起来。您可以用带有大小写折叠键的键替换,例如:dict

test_dict = {key.casefold(): value for key, value in test_dict.items()}

或者用折叠的变体来增强它(因此可以查找原始形式或大小折叠形式:

test_dict.update({key.casefold(): value for key, value in test_dict.items()})

关键是,如果密钥尚未以常见的大小折叠形式出现,则没有解决方案可以从 的功能中受益,这些功能将在使用折叠密钥进行查找时找到展开的密钥,哈希映射不能做这样的事情。dictdictdict

0赞 CodeMaven42 11/15/2023 #2

法典:

test_vals = ['ad', 'ab', 'rD']
test_dict = {'ad': 'Ad', 'Ab': 'aB', 'RD': 'RD'}

# Using a list comprehension to filter keys and retrieve corresponding values
result = [test_dict[key] for key in test_dict if key.lower() in map(str.lower, test_vals)]

打印结果

print(result)

列表推导式遍历test_dict中的键。

key.lower() 将当前键转换为小写,以便进行不区分大小写的比较。

map(str.lower, test_vals) 将 test_vals 中的所有元素转换为小写,以实现不区分大小写的匹配。

map(str.lower, test_vals) 中的条件 key.lower() 检查当前键的小写版本是否存在于 test_vals 中任何元素的小写版本中。

如果条件为 true,则结果列表中将包含相应的值 test_dict[key]。