需要将一个列表中的字符串匹配到另一个列表中的字符串

时间:2019-08-01 13:18:25

标签: python python-3.x

我有2个列表,第一个列表keywords包含关键字['aca','old'],第二个列表Tbl_names包含数据库中的表名。我需要获取与第一个列表中的关键字匹配的表名。问题是,如果第二个列表中有instaging_vaca_2019表,则在Python中使用tapi_sold运算符会给我错误的结果,因为不应返回这两个输出。如果我使用'='运算符,则不会返回名称为'aca_2019'的表,应该将其返回。

我将匹配的表名保存在另一个名为Tbl_keywords的列表中。 问题是,如果我尝试使用定界符进行分隔,那么我将无法像在下面的代码中那样附加它。

for a in keywords:
    for j in Tbl_names:
        if a in j:
            Tbl_keywords.append(j)

4 个答案:

答案 0 :(得分:1)

如果您想像以前一样继续使用double循环。

更改if语句。

旧:

if a in j:

新功能:

if a == j:

答案 1 :(得分:0)

根据给出的信息,我只需将.split("_")添加到您的j

这完全取决于表名的格式。如果您的表名总是用下划线分隔(例如您的示例'aca_2019'),则可以将下划线上的表名拆分为一个新列表。因此,使用相同的示例,您可以使用'aca_2019'.split("_"),并显示以下列表:['aca', '2019']

然后可以检查'aca'是否在此列表中。即使没有下划线,也将始终通过使用split()来接收列表。这样可以确保您不会将acavaca匹配,就像对字符串使用in一样(例如在您的工作示例中)。

for a in keywords:
    for j in Tbl_names:
        if a in j.split("_"):
            Tbl_keywords.append(j)

但是,如果您的表名存储方式不同(我们不知道),那么我将开始研究正则表达式(Python中的re模块)。

答案 2 :(得分:0)

我提供了两个答案,以防万一,您只需要完全匹配,或者只需要表名称中的整个单词。您希望将关键字设置为一组。您可以仅遍历表名(不能同时遍历两个列表,即O(n ^ 2),并进行O(1)设置查找,n次。

我使用列表理解语法而不是for循环。它的效率略高,但不是像double for循环这样的大算法问题。如果需要,我可以将其转换为for循环,但是我建议您习惯使用它们。

# keywords should be a set for faster lookup
keywords = {'aca', 'old', 'exact', 'partial'}

# Tbl_names will be a list (resultset)
table_names = ['staging_vaca_2019', 'tapi_sold', 'exact', 'find_partial_match']

# exact matches
exact_matches = [table for table in table_names if table in keywords]
print ('exact matches:', exact_matches)

# keywords that appear as whole words inside the table name
all_table_keywords = [word for table in table_names for word in table.split('_') if word in keywords]
print ('partial matches:', all_table_keywords)
  

完全匹配:['exact']
  部分匹配:['exact','partial']

答案 3 :(得分:0)

应该只能通过Tbl_names进行迭代:

result = [item for item in Tbl_names if item in keywords]