我正在尝试找到一种在值列表中搜索字符串的方法,如果存在则返回辅助值。能够进行“近距离”匹配会更好。
我将使用的值列表相当大(200,000条以上的记录)并具有以下结构:
data1 -> number1
data2 -> number2
data3 -> number3
我将使用我的字符串与data1进行比较,如果匹配,我想返回number1。
可以以任何方式操纵数据,因为我可以访问原始数据。
我将用于搜索的字符串是用户创建的,并且没有一致性,因此为什么“关闭”匹配会非常有用。
搜索与实际数据的示例如下:
User value: ABC CO INC
Actual Value: ABC Company, INC
User value: Baker Company
Actual Value: Baker Company, INC
会出现较大的不一致,但无论如何都很可能需要手动编辑。我只是想减轻手动输入的工作量。
最好的方法是什么?
答案 0 :(得分:0)
如果您正在进行随机访问,字典似乎是一个更好的选择,因为它基于哈希函数,并且可能更有效:
d = {
'data1': 'number1',
'date2': 'number2'
}
num = d['data1']
如果你需要遍历整个结构,你可以检索密钥,然后像这样检索每个项目,虽然肯定会有相当多的开销,因为必须对每个项目应用哈希函数项目
for key in d.keys():
do_something(key, d[key])
如果你将主要遍历整个结构,你可以将它们存储为这样的元组列表:
l = [
('data1', 'number1'),
('data2', 'number2')
]
您可以像这样迭代结构:
for data, number in l:
do_something(data, number)
你可以使用这样的生成器进行随机访问:
z = next(number for data, number in l if data == 'data1')
随机访问的效率会降低,因为你必须遍历所有前面的元素,直到找到你要查找的元素为止,但如果你主要是迭代的话,速度会快很多
答案 1 :(得分:0)
正如评论所说,字典是存储基础数据的最佳方式,您必须进一步指定“近距离匹配”的含义。
因此,您将数据存储在字典中,如下所示(根据您问题中的示例数据):
data = {
"data1" : number1,
"data2" : number2,
"data3" : number3,
}
假设您已经创建了一些评估“亲密度”的功能。在这种情况下,你的目标是'输入
def closeness(string, target)
...
return closeness_score
如果string == target,则返回最大接近度分数(比如接近度是百分比,它实际上取决于你的意思)。
然后你可以使用蟒蛇' sort'函数(https://docs.python.org/2/library/functions.html#sorted)按照如何关闭'来排序数据。它是:by_closeness = sorted(data.keys(), key = lambda x: closeness(x, target), reverse = True)
那么你最接近的比赛将是
closest_match = by_closeness[0]
然后你只需返回值
value = data[closest_match]
如果你没有要求这种“亲密关系”。并且只是寻找完全匹配,你仍然使用字典的想法,但只返回值:
value = data[target]
您可以通过使用字典来获得更强大的功能' get'方法,如果目标不在密钥中,则返回默认值:
value = data.get(target, 'Target not found')
如果它只是你想要的某种字符串亲密度,那么有很多措施,其中一个例子是Levenstein距离(http://www.wikiwand.com/en/Levenshtein_distance)。
查看贴近度的另一个关键步骤是以某种方式规范化所有输入的字符串,即将所有字符串转换为小写字母,摆脱标点符号等。
从您给出的示例中,特别是替换常见缩写等可能是个好主意,即CO - > company,Incorporated ---> INC等。如果您关注数据,您可能会发现很多这些数据。