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]]
我有两个列表,一个列表包含人们的姓氏,另一个列表包含类似数据。我已经使用 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]]