Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在给定dict1键2时查找dict1键1的值?_Python_Search_Dictionary_Key Value_Lookup Tables - Fatal编程技术网

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
,它会加快速度。