2012-12-10 34 views
1

我想從'foo'的值最接近'barn'的字典的密鑰'haz'中獲取值。當給出dict1 key2時,查找dict1 key1的值?

這裏是我的低效解決方案:

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] 

什麼是更好的解決方案?

+0

我想你會需要一個不同的數據結構,除了一系列的字典。但首先,「最接近」是什麼意思?編輯距離? – acjay

+0

我總覺得應該禁止foo bar baz。蘋果和桔子ftw。 – devsnd

+0

但是你不能比較蘋果與橘子! – stackoverflowuser95

回答

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

我會找到一個更快的編輯距離實現,如調用SequenceMatcher(其中get_close_matches內部所做的)不是一個理想的解決方案。

+0

我使用'time'命令對我的解決方案進行了測試,它似乎表現一貫較差(儘管只有一點點),同時需要更大的改變。 –

+0

@Maxwell:這是因爲它每次都會創建一個新的'SequenceMatcher'對象。找到像get_diff(a,b) - > float這樣的替代函數,它會加快速度。 – Blender

相關問題