我使用FuzzyWuzzy将字符串与包含两个字符串的元组进行匹配。例如:
from fuzzywuzzy import fuzz, process
query = "cat"
animals = [('cat','owner1'),('dog','owner3'),('lizard','owner45')]
result = process.extractOne(query, animals, scorer=fuzz.ratio)此代码返回错误,因为要比较的列表animals不是字符串列表。我只想与元组中的第一项进行比较。我希望返回的是:(('cat','owner1), 100),因为它是100%匹配的。
下面的代码可以工作,输出('cat', 100),但我需要元组的另一部分。
from fuzzywuzzy import fuzz, process
query = "cat"
animals = ["cat","dog",'lizard']
result = process.extractOne(query, lex, scorer=fuzz.ratio)
print(result)有什么想法吗?
编辑:我知道我可以通过列表理解得到第一个元素的列表,但出于内存和速度的原因,我希望在不创建新列表的情况下这样做,因为我正在处理大型数据集。
发布于 2018-02-23 03:45:52
通过使用列表理解,您可以从元组列表中创建仅包含每个元组的第一项的子列表。
>>> animal_owners = [('cat','owner1'),('dog','owner3'),('lizard','owner45')]
>>> [ao[0] for ao in animal_owners]
['cat', 'dog', 'lizard']使用这种技术,您可以替换第二个表达式,其中您只需要动物,而不需要原始列表。
发布于 2021-10-13 14:25:03
我知道这篇文章比较老,但这是一个我不得不解决的问题,并找到了一种方法来解决它!如果你看一下它的签名:
process.extractOne(
query,
choices,
processor: function=function,
scorer:function=function,
score_cutoff: int=0
)您可以利用processor函数返回要分析的每个元组的值。例如,假设您有一个元组形式的公司名称及其股票代码列表,并希望根据公司名称获取最接近的匹配项:
from fuzzywuzzy import process
def get_company_name(tup):
return tup[0]
choices = [
('Apple, Inc.', 'AAPL'),
('Google, Inc.', 'GOOGL'),
('Tesla, Inc.', 'TSLA')
]
closest_match = process.extractOne("apple", choices, processor=get_company_name)然后脚本将返回一个包含最佳匹配元组和pct匹配的元组:
(('Apple, Inc.', 'AAPL'), 100)
https://stackoverflow.com/questions/48935837
复制相似问题