我试图找到一种方法,在值列表中搜索一个字符串,并返回一个辅助值(如果有)。做一场“亲密”比赛的能力会更好。在
我将使用的值列表相当大(200000多个记录),其结构如下:
data1 -> number1
data2 -> number2
data3 -> number3
我将使用我的字符串与data1进行比较,如果匹配,我将返回number1。在
数据可以以任何方式进行操作,因为我可以访问原始数据。在
我将用于搜索的字符串是用户创建的,不具有一致性,因此“接近”匹配将非常有用。在
搜索数据与实际数据的示例如下:
^{pr2}$会有更大的不一致,但这些很可能需要手动编辑。我只是想减轻手工录入的工作量。在
最好的办法是什么?在
正如评论所说,字典将是存储底层数据的最佳方式,并且您必须进一步指定“紧密匹配”的含义。在
因此,您可以将数据存储在字典中,如下所示(基于问题中的示例数据):
假设您创建了一些函数,该函数在这个上下文中对您的“目标”输入求值“closeness”
^{pr2}$这样,如果string==target,则返回最大的贴近度得分(比如closiness是一个百分比,它实际上取决于您的意思)。在
然后,您可以使用pythons'sorted'函数(https://docs.python.org/2/library/functions.html#sorted)根据数据的“接近程度”对数据进行排序:
那么你最接近的对手就是
^{4}$然后返回值
如果您没有这种“亲密度”的要求,而只是寻找一个完全匹配的值,那么您仍然可以使用字典的思想,但只返回值:
可以使用dictionary“get”方法使其更健壮,如果键中不存在target,则该方法将返回默认值:
如果这只是您想要的某种字符串接近度,那么有很多种度量方法,例如Levenstein距离(http://www.wikiwand.com/en/Levenshtein_distance)。在
另一个关键的步骤是将所有输入的字符串规范化,即将所有输入的字符串都转换为小写,去掉标点符号等
从你给出的例子来看,替换常用的缩写词可能是个好主意,比如CO>;company,Incorporated->;INC等等。如果你仔细观察你的数据,你可能会发现其中很多。在
如果您进行随机访问,字典似乎是一个更好的选择,因为它基于哈希函数,并且可能会更高效:
如果您需要在整个结构中迭代,您可以检索键,然后像这样检索每个项,尽管这肯定会有相当大的开销,因为必须对每个项应用哈希函数。在
^{pr2}$如果您主要是遍历整个结构,可以将它们存储为一个tuple列表,如下所示:
您可以像这样在结构中迭代:
^{4}$你可以用这样的生成器随机访问:
对于随机访问,这将是不太有效的,因为您将不得不遍历所有先前的元素,直到找到您要查找的元素,但是如果您主要是迭代,则速度会更快
相关问题 更多 >
编程相关推荐