求助:Python 2.7.13下网络设备不合规端口排查问题
解决Python 2.7.13中端口差集计算错误的问题
嘿,我来帮你搞定这个端口排查的问题!你说用集合差集得不到正确结果,大概率是数据类型不匹配或者端口格式不一致导致的,咱们一步步来解决:
常见问题原因
- 数据类型不一致:比如一个列表里是整数(
22),另一个是字符串("22"),Python会把它们当成不同的元素,集合差集自然就错了 - 端口格式有差异:比如有的端口带空格(
" 80")或者多余符号,和合规列表里的"80"不匹配 - 需要保留重复项:集合会自动去重,如果你的需求是找出所有(包括重复出现的)不合规端口,集合就不适用了
解决方案
1. 统一数据类型(最常见的修复方式)
先把两个列表里的端口转成相同类型(全转整数或全转字符串),再做差集操作。举个例子:
# 假设你的原始数据是这样的(类型混合) all_ports = [22, 80, 443, 21, 8080] compliant_ports = ["22", "80", "443"] # 把合规端口转成整数,和所有端口类型统一 compliant_set = set(int(port) for port in compliant_ports) all_set = set(all_ports) # 计算差集得到唯一的不合规端口 non_compliant_ports = all_set - compliant_set print("不合规端口:", non_compliant_ports) # 输出 {21, 8080}
2. 清理端口格式
如果端口是字符串且存在空格、换行等多余字符,先做格式清理:
all_ports = ["22", " 80", "443\n", "21", "8080"] compliant_ports = ["22", "80", "443"] # 清理所有端口的空格、换行符 clean_all = [port.strip() for port in all_ports] clean_compliant = [port.strip() for port in compliant_ports] # 计算差集 non_compliant = set(clean_all) - set(clean_compliant) print("不合规端口:", non_compliant) # 输出 {'21', '8080'}
3. 保留重复的不合规端口
如果需要列出所有出现的不合规端口(包括重复项),不要用集合,改用列表推导:
all_ports = [22, 21, 80, 21, 8080] compliant_set = {22, 80, 443} # 遍历所有端口,筛选不在合规集合里的 non_compliant_list = [port for port in all_ports if port not in compliant_set] print("所有不合规端口(含重复):", non_compliant_list) # 输出 [21, 21, 8080]
排查小技巧
如果还是不对,可以先打印两个集合的内容,看看是不是有预期外的元素:
print("所有端口集合:", set(all_ports)) print("合规端口集合:", compliant_set)
这样就能快速定位是类型还是格式的问题啦!
内容的提问来源于stack exchange,提问作者Indranil
相关产品推荐
相关产品推荐

