Python如何比对两个列表里的字符串?

如下图,有whitelist和list两个列表,list列表会出现三种情况

img

img

img


我逐个去比对列表中的字符串内容是用contains还是用in或者是什么模块的方法更简便呢?
第二种情况和第三种情况里的进程数量和进程名怎么可以动态显示,因为list每次响应的内容都不一样,whitelist里的字符串数量也会往上添加

def func():
    #定义白名单列表
    whitelist = ["tfg_fault_manager", "omzq_server_node", "log_agent", "cm_proxy"]

    # list1 = ["xxx1", "xxx2", "xxx3", "xxx4", "xxx5", "xxx6", "xxx7", "xxx8"]
    # list2 = ["xxx1", "log_agent", "xxx3", "omzq_server_node", "xxx5", "tfg_fault_manager", "xxx7", "xxx8"]
    list3 = ["xxx1", "log_agent", "xxx3", "omzq_server_node", "xxx5", "tfg_fault_manager", "xxx7", "cm_proxy"]

    for i in list3:
        if whitelist.__contains__(i):
            result = "?"
            print(result)
            return True
        else:
            return False
print(func())

已完成,并测试通过

img

用in,尽量别用contains,那是类的内部方法
你用in,语法也简单,可读性也强,后台其实调用的就是contains

该回答引用GPTᴼᴾᴱᴺᴬᴵ
您可以使用Python内置的set数据类型进行集合操作,将列表转换为集合后使用交集、差集等操作实现比对。
以下是您提供的代码的修改建议:

def func():
    # 定义白名单列表
    whitelist = ["tfg_fault_manager", "omzq_server_node", "log_agent", "cm_proxy"]
 
    list1 = ["xxx1", "xxx2", "xxx3", "xxx4", "xxx5", "xxx6", "xxx7", "xxx8"]
    list2 = ["xxx1", "log_agent", "xxx3", "omzq_server_node", "xxx5", "tfg_fault_manager", "xxx7", "xxx8"]
    list3 = ["xxx1", "log_agent", "xxx3", "omzq_server_node", "xxx5", "tfg_fault_manager", "xxx7", "cm_proxy"]
 
    # 求交集
    intersection = set(list3) & set(whitelist)
    intersection_count = len(intersection)
    intersection_str = ';'.join(list(intersection))
 
    # 求差集
    difference = set(whitelist) - set(list3)
    difference_count = len(difference)
    difference_str = ';'.join(list(difference))
 
    if intersection_count == len(whitelist):
        result = f"白名单中的{intersection_count}个进程 {intersection_str} 全部响应成功"
        print(result)
        return True
    elif intersection_count > 0:
        result = f"白名单中的{intersection_count}个进程 {intersection_str} 响应成功,白名单中的{difference_count}个进程 {difference_str} 未响应"
        print(result)
        return False
    else:
        result = "白名单列表中的进程全部未响应"
        print(result)
        return False
 
print(func())


这段代码可以处理您提供的三种情况,并且可以动态显示进程数量和进程名。

list3结果

img

list2结果

img

list1结果

img

def func():
    # 定义白名单列表
    whitelist = ["tfg_fault_manager", "omzq_server_node", "log_agent", "cm_proxy"]

    list1 = ["xxx1", "xxx2", "xxx3", "xxx4", "xxx5", "xxx6", "xxx7", "xxx8"]
    #list2 = ["xxx1", "log_agent", "xxx3", "omzq_server_node", "xxx5", "tfg_fault_manager", "xxx7", "xxx8"]
    #list3 = ["xxx1", "log_agent", "xxx3", "omzq_server_node", "xxx5", "tfg_fault_manager", "xxx7", "cm_proxy"]
    c_list =[]
    r_list =[]
    for i in list1:
        if i in whitelist :
            c_list.append(i)        #### 包含列表
        else:
            r_list.append(i)        #### 不包含列表

    if len(c_list) == 0 :
        result ='白名单列表中的进程全部未响应'
        print(result)                    ####第一种情况
        return False
    elif len(c_list) >0 and len(r_list) >0 :
        result = ','.join(c_list) + '响应成功'
        print(result)
        false_infomation = ','.join(r_list) + '未响应成功'
        print(false_infomation)
        return  False
    else :
        result = ','.join(c_list) + '全部响应成功'
        print(result)
        return True
print(func())

参考GPT和自己的思路,以下是实现你需求的代码,如有疑问请回复:

whitelist=["tfg_fault_manager","omzq_server_node","log_agent","cm_proxy"]
list1=["xxx1","xxx2","xxx3","xxx4","xxx5","xxx6","xxx7","xxx8"]
list2=["xxx1","log_agent","xxx3","omzq_server_node","xxx5","tfg_fault_manager","xxx7","xxx8"]
list3=["xxx1","log_agent","xxx3","omzq_server_node","xxx5","tfg_fault_manager","xxx7","cm_proxy"]

# 查找列表中的交集
def intersection(lst1, lst2):
    return list(set(lst1) & set(lst2))

# 情况1:列表whitelist和list1的字符串都不一样
if not intersection(whitelist, list1):
    print("白名单列表中的进程全部未响应")

# 情况2:列表whitelist和list2的字符串一部分一样
if intersection(whitelist, list2):
    processes = ';'.join(intersection(whitelist, list2))
    print(f"白名单中的{len(intersection(whitelist, list2))}个进程{processes}响应成功")

# 情况3:列表whitelist和list3的字符串完全一样
if whitelist == list3:
    processes = ';'.join(whitelist)
    print(f"白名单中的{len(whitelist)}个进程{processes}全部响应")

参考GPT和自己的思路:可以使用Python内置的in运算符来判断一个元素是否在列表中,比如:

if i in whitelist:
    # do something

另外,如果需要同时获取元素在列表中的位置和内容,可以使用enumerate函数,比如:

for index, element in enumerate(list):
    # do something with index and element

对于第二种情况和第三种情况中的进程数量和进程名需要动态显示的问题,可以使用字符串的格式化功能。可以使用占位符(比如%s)表示需要替换的内容,然后使用字符串的format方法将占位符替换为实际的值。比如:

result = "白名单中的%d个进程,%s响应成功,白名单中的%d个进程%s未响应" % (num_success, success_names, num_fail, fail_names)

其中%d表示一个整数占位符,%s表示一个字符串占位符,%后面的括号中的值会依次替换占位符。num_success和num_fail是成功和失败的进程数量,success_names和fail_names是成功和失败的进程名列表,用分号分隔。

您也可以使用in关键字来检查一个元素是否在一个列表中,如:if i in whitelist:,这将检查列表whitelist中是否存在元素i。此外,您可以使用set()函数来计算两个列表的交集,从而得到两个列表中相同的元素数量,如:len(set(list2) & set(whitelist))。

要动态显示第二种情况和第三种情况中的进程数量和名称,您可以使用字符串格式化。例如,您可以使用len(set(list2) & set(whitelist))来获取相同的元素数量,然后使用字符串格式化将该数量插入到结果字符串中。您可以使用str.join()方法来将两个列表中的元素连接为一个字符串,如:";".join(set(list2) & set(whitelist))。
下面是修改后的代码示例:

def func():
    # 定义白名单列表
    whitelist = ["tfg_fault_manager", "omzq_server_node", "log_agent", "cm_proxy"]
 
    # list1 = ["xxx1", "xxx2", "xxx3", "xxx4", "xxx5", "xxx6", "xxx7", "xxx8"]
    # list2 = ["xxx1", "log_agent", "xxx3", "omzq_server_node", "xxx5", "tfg_fault_manager", "xxx7", "xxx8"]
    list3 = ["xxx1", "log_agent", "xxx3", "omzq_server_node", "xxx5", "tfg_fault_manager", "xxx7", "cm_proxy"]
 
    common_elements = set(list3) & set(whitelist)
    if len(common_elements) == 0:
        result = "白名单列表中的进程全部未响应"
        print(result)
        return False
    elif len(common_elements) == len(whitelist):
        result = "白名单中的{}个进程,{}全部响应成功".format(len(common_elements), ";".join(common_elements))
        print(result)
        return True
    else:
        success_elements = ";".join(common_elements)
        failed_elements = ";".join(set(whitelist) - common_elements)
        result = "白名单中的{}个进程,{}响应成功,白名单中的{}个进程{}未响应".format(
            len(common_elements), success_elements, len(failed_elements), failed_elements
        )
        print(result)
        return False
 
print(func())