我有2个列表,第一个列表keywords
包含关键字['aca','old']
,第二个列表Tbl_names
包含数据库中的表名。我需要获取与第一个列表中的关键字匹配的表名。问题是,如果第二个列表中有in
或staging_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)
答案 0 :(得分:1)
如果您想像以前一样继续使用double循环。
更改if语句。
旧:
if a in j:
新功能:
if a == j:
答案 1 :(得分:0)
根据给出的信息,我只需将.split("_")
添加到您的j
。
这完全取决于表名的格式。如果您的表名总是用下划线分隔(例如您的示例'aca_2019'
),则可以将下划线上的表名拆分为一个新列表。因此,使用相同的示例,您可以使用'aca_2019'.split("_")
,并显示以下列表:['aca', '2019']
。
然后可以检查'aca'
是否在此列表中。即使没有下划线,也将始终通过使用split()
来接收列表。这样可以确保您不会将aca
与vaca
匹配,就像对字符串使用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]