为了账号安全,请及时绑定邮箱和手机立即绑定

使用键开始字符访问Python字典值

使用键开始字符访问Python字典值

慕容森 2021-03-28 22:10:29
我想知道:是否可以使用不完整的键访问dict值(只要给定字符串的条目不超过一个)?例如:my_dict = {'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'}print my_dict['Date']>> '15th july'这可能吗?怎么做?
查看完整描述

4 回答

?
慕雪6442864

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']


查看完整回答
反对 回复 2021-04-01
?
德玛西亚99

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


查看完整回答
反对 回复 2021-04-01
?
子衿沉夜

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]


查看完整回答
反对 回复 2021-04-01
  • 4 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信