0

我想要实现的是以特定模式排列列表中的项目。说,我有以下字典:

>>>dict_a = {
       'north' : 'N',
       'south' : 'S',
       'east' : 'E',
       'west' : 'W',
       'north east' : 'NE',
       'north west' : 'NW'
   }

现在检查一个字符串是否包含上述字典中的任何项目:

>>>string_a = 'North East Asia'
>>>list_a = []
>>>for item in dict_a:
       if item in string_a.lower():
           list_a.append(item)

它给我的结果如下,这是有道理的

>>>['north', 'north east', 'east']

但我想要得到的是['north east']并忽略northand east。我如何实现这一点?

4

3 回答 3

5

尝试difflib.closest_match

>>> dict_a = {
       'north' : 'N',
       'south' : 'S',
       'east' : 'E',
       'west' : 'W',
       'north east' : 'NE',
       'north west' : 'NW'
   }
>>> import difflib
>>> string_a = 'North East Asia'
>>> dict_a[difflib.get_close_matches(string_a, dict_a.keys())[0]]
'NE'
于 2013-01-16T10:01:48.797 回答
3

您可以使用OrderedDict(Python 2.7+ 中的新功能)以一致的顺序存储键/值对。要获得单个结果,只需在第一次匹配后中断循环。

import collections

# create the mapping with the desired order of matches
dict_a = collections.OrderedDict([
    ('north east', 'NE'),
    ('north west', 'NW'),
    ('north', 'N'),
    ('south', 'S'),
    ('east', 'E'),
    ('west', 'W'),
])

string_a = 'North East Asia'
list_a = []
for item in dict_a:
    if item in string_a.lower():
        list_a.append(item)
        break  # found something
于 2013-01-16T10:11:32.480 回答
2
>>> max(['north', 'north east', 'east'], key=len)
'north east'
于 2013-01-16T09:59:05.510 回答