1

我正在使用 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)

有任何想法吗?

编辑:我知道我可以通过列表理解获得第一个元素的列表,但是出于内存和速度的原因,我想在不创建新列表的情况下执行此操作,因为我正在处理大型数据集。

4

2 回答 2

1

从您的元组列表中,您可以使用列表推导创建一个仅包含每个元组的第一项的子列表。

>>> animal_owners = [('cat','owner1'),('dog','owner3'),('lizard','owner45')]
>>> [ao[0] for ao in animal_owners]
['cat', 'dog', 'lizard']

使用这种技术,您可以替换仅需要动物的第二个表达式,而无需保留原始列表。

于 2018-02-22T19:45:51.907 回答
0

我知道该帖子较旧,但这是我必须解决的问题并找到了解决方法!如果你看一下它的签名:

process.extractOne(
     query, 
     choices, 
     processor: function=function, 
     scorer:function=function, 
     score_cutoff: int=0
)

您可以利用处理器函数返回要分析的每个元组的值。例如,假设您有一个公司名称列表及其元组中的股票代码,并希望根据公司名称获得最接近的匹配:

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)

于 2021-10-13T14:25:03.220 回答