我想知道:是否可以使用不完整的密钥访问dict值(只要给定字符串的条目不超过一个)?例如:
my_dict = {'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'}
print my_dict['Date']
>> '15th july'
这可能吗?怎么可能呢?
答案 0 :(得分:38)
您无法直接使用dict[keyword]
执行此操作,您必须遍历dict并将每个键与关键字匹配,并在找到关键字时返回相应的值。
这将是O(N)
操作。
>>> my_dict = {'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'}
>>> next(v for k,v in my_dict.items() if 'Date' in k)
'15th july'
要获取所有此类值,请使用列表解析:
>>> [ v for k,v in my_dict.items() if 'Date' in k]
['15th july']
如果您只想要那些键以“Date”开头的值,请使用str.startswith
:
>>> next( v for k,v in my_dict.items() if k.startswith('Date'))
'15th july'
>>> [ v for k,v in my_dict.items() if k.startswith('Date')]
['15th july']
答案 1 :(得分:5)
不是最佳解决方案,可以改进(覆盖 getitem )
class mydict(dict):
def __getitem__(self, value):
keys = [k for k in self.keys() if value in k]
key = keys[0] if keys else None
return self.get(key)
my_dict = mydict({'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'})
print(my_dict['Date'])# returns 15th july
答案 2 :(得分:3)
当然有可能:
print next(val for key, val in my_dict.iteritems() if key.startswith('Date'))
但这会在字典中进行全面扫描。它只找到第一个这样的匹配键(其中'first'是任意的),如果没有键匹配,则引发StopIteration
而不是KeyError
。
为了更接近你的想法,最好把它写成一个函数:
def value_by_key_prefix(d, partial):
matches = [val for key, val in d.iteritems() if key.startswith(partial)]
if not matches:
raise KeyError(partial)
if len(matches) > 1:
raise ValueError('{} matches more than one key'.format(partial))
return matches[0]
答案 3 :(得分:1)
>>> my_dict = {'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'}
>>> next(v for k,v in my_dict.items() if 'Date' in k)
'15th july'
>>> [ v for k,v in my_dict.items() if 'Date' in k]
['15th july']
>>> next( v for k,v in my_dict.items() if k.startswith('Date'))
'15th july'
>>> [ v for k,v in my_dict.items() if k.startswith('Date')]
['15th july']
如果我使用上面给出的方法我得到StopIteration异常
答案 4 :(得分:0)
您并不是在建议一致的API:
my_dict['']
的结果应该是什么?您没有一对一的映射。str
以外的其他类型?你不能直接拥有它的另一个原因,即使是字符串并假设你总是返回一个列表,是因为Python的dict
是使用哈希表实现的,它将映射xy
和{ {1}}表格中不相关的单元格。
所以,走另一条道路:这样的查找意味着需要更慢的xz
实现,(这是没有意义的,针对不常见的使用进行优化)或者像完整扫描一样慢 - 您也可以手工编写,因为 通常值得一个专用的便利方法。
答案 5 :(得分:0)
在pywinauto中有一个很好的,聪明的'模糊'字典实现 - 这可能是你在这里所需要的完美。
https://code.google.com/p/pywinauto/source/browse/pywinauto/fuzzydict.py
和docs: http://pywinauto.googlecode.com/hg/pywinauto/docs/code/pywinauto.fuzzydict.html
(编辑:虽然如果你特别想从键的开头匹配,你可能需要用你的自定义代码替换SequenceMatcher逻辑)
答案 6 :(得分:0)
您可以使用内置的过滤器功能根据特定条件过滤字典,列表等。
filtered_dict = dict(filter(lambda item: "Date" in item[0], my_dict.items()))
优点是您可以将其用于不同的数据结构。