在不知道完整名称的情况下如何在字典中查找键

1 投票
3 回答
510 浏览
提问于 2025-04-17 05:21

我有一个字典,其中有一个键是以“ev”开头,后面跟着一些我事先不知道的数字(用####表示)。这个字典里只有一个这样的键,而且没有其他键是以“ev”开头的。

那么,怎么才能在不知道这个数字是什么的情况下,干净利落地访问到这个键呢?

3 个回答

0

首先,把这个项目存储在字典里时,不要加上ev这个前缀。

如果你还需要用这个前缀来访问它,那就两种方式都存储一下。

如果一个数字可能有多个前缀,那就用第二个字典来存储每个数字对应的实际键,可以用列表或者子字典的方式来存,这样就能找到主字典里与这个数字匹配的可用键。

如果在最开始创建字典的时候不容易做到这一点(比如说,字典是别人写的代码给你的,你不能改动它),而且你需要进行很多这样的查找,那就值得花时间遍历一次字典,创建第二个字典,或者用一个字典来缓存这些查找,或者类似的做法,这样就不用每次都遍历键了。

4

你可以试试这个列表推导式:(ideone)

result = [v for k, v in d.iteritems() if k.startswith('ev')][0]

或者用这个生成器表达式的方法:(ideone)

result = next(v for k, v in d.iteritems() if k.startswith('ev'))

需要注意的是,这两种方法都需要逐个检查字典里的每一项,这和普通的键查找不同,普通查找平均情况下是很快的(前提是哈希函数表现良好)。不过,生成器表达式一旦找到目标键就会停止,而列表推导式则会一直检查整个字典。

0

如果字典里只有一个这样的值,我觉得用下面这种方法会更好:

for k,v in d.iteritems():
    if k.startswith('ev'):
        result = v
        break
else:
    raise KeyError()  # or set to default value

这样的话,你就不需要遍历字典里的每一个值,只需要找到那个键就行了,这样平均能把计算速度提高大约两倍。

撰写回答