2017-12-18 194 views
-2

在python字典中获取项目的最快方法是给出多少个键?什么是从字典中获得项目的最佳方式,在Python中提供了几个键

我想给用户从他们键入的键的val。例如:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} 

所以,如果他们输入Name,该功能将打印Zara

**但是,如果用户用大写或小写字母写道,该功能仍然能够回到他在找什么对于。

因此,如果用户输入:Name/NaMe/namE,我的函数仍然会返回val Zara

+2

你可能是指'name' /'Name' /'NaMe' /'naME'? –

+1

此外请不要命名变量'list','dict'等。它会覆盖对“dict”类的引用。 –

+1

如果字典包含(例如)“名称”和“名称”键,会发生什么? –

回答

1

下面是一个应该有意义的假设 - 没有只区分区分大小写的密钥(否则,您的问题不再有意义)。

你要做的是创建一个新的字典所有小写字母键。相应地,在查询时,小写查询键并索引字典。以下是你如何做到这一点。

In [63]: n_dict = {k.lower() : v for k, v in dct.items()} 

In [64]: n_dict 
Out[64]: {'age': 7, 'class': 'First', 'name': 'Zara'} 
In [65]: key = 'NaMe' 

In [66]: n_dict.get(key.lower()) 
Out[66]: 'Zara' 

作为一个侧面说明,不要用dict命名您的变量,因为dict是一个内建的,你最终会遮蔽的名称。

+0

但我的字典有例如像键: – user5890682

+0

@ user5890682像什么? –

+0

感谢您的回答,但在我的情况下,它更复杂,我只是给我Q的例子,他们有什么办法可以帮助我找到解决问题的方法吗? – user5890682

0

假设你的钥匙都是单个单词的第一个字母captial:

x = userInput.lower() 
y = x.title() 
print myDict[y] 
+0

为什么要降低'x'然后调用'title'?此外,这在无效的语法。 –

+0

小写字母x只是一个示例变量名称。还有,我访问字典的方式是错误的语法,我修正了它。 首先使用.lower()使整个字符串小写,然后使用.title() –

+0

将字符串大写中的每个单词的第一个字母做好,但我想说的是,不需要先小写它。 –

1

采取从requests包一看CaseInsensitiveDict

虽然它在一个不相关的包中,但您可能已经在您的项目中使用它了。如果没有,或者你不想要依赖(很好避免),你可以复制代码或将它用作你自己实现的灵感。

一个优点是,CaseInsensitiveDict支持一般词典的方法,包括操作者in

from requests.structures import CaseInsensitiveDict 

d = CaseInsensitiveDict({'Name': 'Zara', 'Age': 7, 'Class': 'First'}) 

>>> d.get('NAME') 
'Zara' 
>>> d.get('name') 
'Zara' 
>>> d['NaMe'] 
'Zara' 
>>> d['NoName'] 
Traceback (most recent call last): 
... 
KeyError: 'noname' 
>>> 'NoName' in d 
False 
>>> 'Name' in d 
True 
>>> 'NAME' in d 
True 

一个缺点是,该键必须是字符串。另一个原因是,只有一个每个键的情况下,变型是允许的(但是这尴尬/无厘头反正):

>>> CaseInsensitiveDict({'Name': 123, 'name': 456, 'NaMe': 789}) 
{'NaMe': 789} 
0

另一种选择是使用正则表达式:

import re 
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} 
key = "naMe" 
new_data = [b for a, b in dict.items() if re.findall('^{}$'.format(key), a, re.IGNORECASE)][0] 

输出:

'Zara' 
+0

认真?你想使用_dictionary_的正则表达式_and_循环? –

相关问题