Return 列表中字符串和子字符串匹配项的索引

Return indices of string and substring matches in lists

我有两个列表,一个列表包含人们的姓氏,另一个列表包含类似数据。我已经使用 any() 来匹配两个列表并输出匹配项。

提供的示例数据,真实列表包含数千个条目。

matchers = ['Balle', 'Jobson', 'Watts', 'Dallow', 'Watkins']
full_name = ['Balle S & R', 'Donald D & S', 'Watkins LTD', 'Balle R & R', 'Dallow K & C']

matching = [s for s in full_name if any(xs in s for xs in matchers)]

print(matching)

我想 return 每个 match.For 上面例子的索引,理想的输出是:

[0, 0], [4, 2], [0, 3], [3, 4] 

我试过:

print([[i for i in range(len(full_name)) if item1 == full_name[i]] for item1 in matchers])

但是这个 return 是一个空数组列表。实际上,我的列表包含数千个条目。当匹配的数据不完全相同时,是否可以找到匹配的索引?

您可以使用“matcher IN name”代替“==”。

说明: enumerate() 帮助我遍历列表和列表中每个值的 returns (index,value)。因此,“index1”将“matcher”的索引存储在列表“matchers”中。 同样,“index2”是full_name.

中“name”的索引

然后,我检查“matcher”是否是“name”的子串。如果这是真的,那么我会将匹配器索引和名称索引添加到最终列表中。

干运行: 比方说当 index1=0, matcher="Balle" 时,我将遍历 full_name 中的所有值。假设 index2=0, name="Balle S & R"。然后,我的 if 检查为真,因为“Balle”是“Balle S & R”的子串。所以,我将 [index1, index2] 是 [0,0] 添加到我的最终列表中。如果匹配器不是子字符串,那么我将忽略该对并继续。

这是一个使用循环的工作代码。

matches = []
#Loop through each value in matchers and store (index, value)
for index1, matcher in enumerate(matchers):

#Loop through each value in full_name and store (index, value)
    for index2, name in enumerate(full_name):

        #Check if matcher is a substring of name
        if(matcher in name):
           
            #If true then add indices to the list 
            matches.append([index1, index2])

这是一个更短、更 pythonic 的版本:

matches = [[i1, i2] for i1 in range(len(matchers)) for i2 in range(len(full_name)) if matchers[i2] in full_name[i1]]

两者的输出: [[0, 0], [0, 3], [3, 4], [4, 2]]