在列表中查找字符串并使用python返回辅助值

2024-05-21 03:09:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一种方法,在值列表中搜索一个字符串,并返回一个辅助值(如果有)。做一场“亲密”比赛的能力会更好。在

我将使用的值列表相当大(200000多个记录),其结构如下:

data1 -> number1
data2 -> number2
data3 -> number3

我将使用我的字符串与data1进行比较,如果匹配,我将返回number1。在

数据可以以任何方式进行操作,因为我可以访问原始数据。在

我将用于搜索的字符串是用户创建的,不具有一致性,因此“接近”匹配将非常有用。在

搜索数据与实际数据的示例如下:

^{pr2}$

会有更大的不一致,但这些很可能需要手动编辑。我只是想减轻手工录入的工作量。在

最好的办法是什么?在


Tags: 数据方法字符串列表原始数据方式记录能力
2条回答

正如评论所说,字典将是存储底层数据的最佳方式,并且您必须进一步指定“紧密匹配”的含义。在

因此,您可以将数据存储在字典中,如下所示(基于问题中的示例数据):

data = {
    "data1" : number1,
    "data2" : number2,
    "data3" : number3,
}

假设您创建了一些函数,该函数在这个上下文中对您的“目标”输入求值“closeness”

^{pr2}$

这样,如果string==target,则返回最大的贴近度得分(比如closiness是一个百分比,它实际上取决于您的意思)。在

然后,您可以使用pythons'sorted'函数(https://docs.python.org/2/library/functions.html#sorted)根据数据的“接近程度”对数据进行排序:

by_closeness = sorted(data.keys(), key = lambda x: closeness(x, target), reverse = True)

那么你最接近的对手就是

^{4}$

然后返回值

value = data[closest_match]

如果您没有这种“亲密度”的要求,而只是寻找一个完全匹配的值,那么您仍然可以使用字典的思想,但只返回值:

value = data[target]

可以使用dictionary“get”方法使其更健壮,如果键中不存在target,则该方法将返回默认值:

value = data.get(target, 'Target not found')

如果这只是您想要的某种字符串接近度,那么有很多种度量方法,例如Levenstein距离(http://www.wikiwand.com/en/Levenshtein_distance)。在

另一个关键的步骤是将所有输入的字符串规范化,即将所有输入的字符串都转换为小写,去掉标点符号等

从你给出的例子来看,替换常用的缩写词可能是个好主意,比如CO>;company,Incorporated->;INC等等。如果你仔细观察你的数据,你可能会发现其中很多。在

如果您进行随机访问,字典似乎是一个更好的选择,因为它基于哈希函数,并且可能会更高效:

d = {
  'data1': 'number1',
  'date2': 'number2'
}

num = d['data1']

如果您需要在整个结构中迭代,您可以检索键,然后像这样检索每个项,尽管这肯定会有相当大的开销,因为必须对每个项应用哈希函数。在

^{pr2}$

如果您主要是遍历整个结构,可以将它们存储为一个tuple列表,如下所示:

l = [
    ('data1', 'number1'),
    ('data2', 'number2')
]

您可以像这样在结构中迭代:

^{4}$

你可以用这样的生成器随机访问:

z = next(number for data, number in l if data == 'data1')

对于随机访问,这将是不太有效的,因为您将不得不遍历所有先前的元素,直到找到您要查找的元素,但是如果您主要是迭代,则速度会更快

相关问题 更多 >