1

に最も近い値'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]

より良い解決策は何ですか?

4

1 に答える 1

1

あなたができること:

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

SequenceMatcherget_close_matches内部で行う)呼び出しは理想的なソリューションではないため、編集距離の実装がより高速であることがわかります。

于 2012-12-10T04:27:45.283 に答える