Python 在给定dict1键2时查找dict1键1的值?
我想从字典的键Python 在给定dict1键2时查找dict1键1的值?,python,search,dictionary,key-value,lookup-tables,Python,Search,Dictionary,Key Value,Lookup Tables,我想从字典的键'haz'中获取值,该字典的'foo'的值最接近'barn' 以下是我的低效解决方案: data = [{'foo': 'bar', 'haz': 'bzr'}, {'foo': 'zoo', 'haz':'bnr'}] from difflib import get_close_matches closest = get_close_matches('barn', [elem['foo'] for elem in data]) print 'result =', [elem[
'haz'
中获取值,该字典的'foo'
的值最接近'barn'
以下是我的低效解决方案:
data = [{'foo': 'bar', 'haz': 'bzr'}, {'foo': 'zoo', 'haz':'bnr'}]
from difflib import get_close_matches
closest = get_close_matches('barn', [elem['foo'] for elem in data])
print 'result =', [elem['haz'] for elem in data if elem['foo']==closest[0]][0]
什么是更好的解决方案?您可以:
from difflib import SequenceMatcher
from functools import partial
from operator import itemgetter
data = [
{'foo': 'bar', 'haz': 'bzr'},
{'foo': 'zoo', 'haz': 'bnr'},
{'foo': 'potato', 'haz': 'test'}
]
matcher = partial(SequenceMatcher, 'barn') # I'd find a better distance function
pairs = enumerate(map(itemgetter('foo'), data)) # Constructs index, value pairs
index, value = sorted(pairs, key=lambda x: matcher(x[1]).ratio())[0]
print data[index]['haz']
我会发现更快的编辑距离实现,因为调用SequenceMatcher
(这是get\u close\u matches
内部执行的)不是理想的解决方案。您可以:
from difflib import SequenceMatcher
from functools import partial
from operator import itemgetter
data = [
{'foo': 'bar', 'haz': 'bzr'},
{'foo': 'zoo', 'haz': 'bnr'},
{'foo': 'potato', 'haz': 'test'}
]
matcher = partial(SequenceMatcher, 'barn') # I'd find a better distance function
pairs = enumerate(map(itemgetter('foo'), data)) # Constructs index, value pairs
index, value = sorted(pairs, key=lambda x: matcher(x[1]).ratio())[0]
print data[index]['haz']
我会发现一个更快的编辑距离实现,因为调用
SequenceMatcher
(这是get\u close\u matches
内部执行的)不是一个理想的解决方案。我认为除了DICT列表之外,您还需要一个不同的数据结构。但首先,你说的“最近”是什么意思?编辑距离?我一直觉得应该禁止foo-bar-baz。苹果和桔子。但是你不能把苹果和桔子比较!我想你需要一个不同的数据结构,除了一个目录列表。但首先,你说的“最近”是什么意思?编辑距离?我一直觉得应该禁止foo-bar-baz。苹果和桔子。但是你不能把苹果和桔子比较!我用time
命令对我的解决方案进行了测试,它的性能似乎一直很差(虽然只有一点点),但需要进行更大的更改。@Maxwell:这是因为它每次都在创建一个新的SequenceMatcher
对象。找到一个替换函数,如get_diff(a,b)->float
,它会加快速度。我用time
命令对我的解决方案进行了测试,它的性能似乎一直较差(虽然只差一点)虽然需要更大的更改。@Maxwell:那是因为它每次都在创建一个新的SequenceMatcher
对象。在替换函数中找到一个drop,比如get_diff(a,b)->float
,它会加快速度。