4 回答
TA贡献1812条经验 获得超5个赞
您不能直接使用来执行此操作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']
使用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']
TA贡献1770条经验 获得超3个赞
不是最好的解决方案,可以改进(覆盖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
TA贡献1828条经验 获得超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]
添加回答
举报