我有一个带有一个名为ev ####的密钥的字典,其中####是一些我不知道的数字。字典中只有一种这种键,没有其他键以ev开头。
在不知道####是什么的情况下访问该密钥最简洁的方法是什么?
答案 0 :(得分: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'))
请注意,这些都需要对字典中的项进行线性扫描,这与普通的键查找不同,后者平均在恒定时间内运行(假设散列函数很好)。但是,生成器表达式可以在找到密钥后立即停止。列表理解将始终扫描整个dicitonary。
答案 1 :(得分:0)
首先在没有ev
前缀的字典中存储该项目。
如果您还需要使用前缀访问它,请将其存储两种方式。
如果给定数字可以有多个前缀,请使用第二个字典,将与每个数字关联的实际密钥存储为列表或子字典,并使用该字典查找与该数字匹配的主字典中的可用密钥
如果你在最初创建字典时不能轻易做到这一点(例如,其他人的代码正在为你提供字典而你无法改变它),那么你将会做很多对于这种类型的查找,可能值得迭代dict一次并创建第二个dict,或者使用dict来缓存查找或类似的东西,以避免每次迭代键。
答案 2 :(得分:0)
如果字典中只有一个这样的值,我会说最好使用类似的方法:
for k,v in d.iteritems():
if k.startswith('ev'):
result = v
break
else:
raise KeyError() # or set to default value
这样你就不必循环遍历字典中的每个值,但只有在你找到密钥之后才能循环,这应该会使计算平均加速约2倍。