为什么我的Python程序找不到两个集合之间的差异?



我能够成功地获得我的wifi上的所有IP地址,我将它们存储在一个knownIP列表中。然后我用iPhone接入WiFi网络进行测试。第二次扫描成功地检测到新IP并将其添加到列表中。我将这两个列表设为一个集合,然后使用其差值。但是它只打印set(),而且它是一个空集合。

# print statements are added for troubleshooting purposes
knownIPlist = initial_scan()
print(knownIPlist)
knownIPList_set = set(knownIPlist)
scanWifi = True
while scanWifi:
print("Turn on iPhone") 
time.sleep(15)
print("Scanning...")
scanIPlist = scan()
print(scanIPlist)
scanIPlist_set = set(scanIPlist)
newIPlist = knownIPList_set.difference(scanIPlist_set)
print(newIPlist)
# for newIP in newIPlist:
#    print(newIP)
print("waiting...")

输出为:

'192.168.1.64', '192.168.1.77', '192.168.1.190', '192.168.1.208', '192.168.1.216', '192.168.1.217', '192.168.1.220', '192.168.1.222', '192.168.1.227', '192.168.1.254', '192.168.1.66'
Turn on iPhone
Scanning...
'192.168.1.64', '192.168.1.77', '192.168.1.190', '192.168.1.208', '192.168.1.210', '192.168.1.216', '192.168.1.217', '192.168.1.220', '192.168.1.222', '192.168.1.227', '192.168.1.254', '192.168.1.66'
set()
waiting...

它成功地在新的扫描中找到了新的IP地址(.210),但它只是打印出"set ()"。它只是一个空集合。为什么不添加和打印新的。210 IP地址到新wiplist ?

set.difference返回左手set中没有在右手set中的元素。向右侧集合添加元素只能减少结果中的元素数,而不能增加结果中的元素数。如前所述,您将报告自创建原始set以来消失的ip,而不是自创建以来出现的新 ip。

只报告新的ip,反转呼叫:

newIPlist = scanIPlist_set.difference(knownIPList_set)

或者为简洁起见(并且为了更清楚地表明您正在从其中删除元素,其中命名的difference方法不太清楚,并且可能是您混淆的根源):

newIPlist = scanIPlist_set - knownIPList_set

knownIPList_set.difference(scanIPlist_set)返回knownIPList_set中不在scanIPlist_set中的所有元素。.210的IP在scanIPlist_set中,不在knownIPList_set中。所以你需要反向操作:

newIPlist = scanIPlist_set.difference(knownIPList_set)

两个集合包含相同的元素,因此当取差值时,结果将是空集合,因此打印set()。

打印,

if(knownIPList_set == scanIPlist_set):
print("True")

@Brandon

你正在尝试相反的,这就是为什么你得到一个空集合。要弄清楚,请运行下面的代码片段:

knownIPList_set = {'192.168.1.64', '192.168.1.77', '192.168.1.190', '192.168.1.208', '192.168.1.216', '192.168.1.217', '192.168.1.220', '192.168.1.222', '192.168.1.227', '192.168.1.254', '192.168.1.66'}
scanIPlist_set = {'192.168.1.64', '192.168.1.77', '192.168.1.190', '192.168.1.208', '192.168.1.210', '192.168.1.216', '192.168.1.217', '192.168.1.220', '192.168.1.222', '192.168.1.227', '192.168.1.254', '192.168.1.66'}
newIPlist_incorrect = knownIPList_set.difference(scanIPlist_set)
print(newIPlist_incorrect)

newIPlist_correct = scanIPlist_set.difference(knownIPList_set)
print(newIPlist_correct)

输出如下:

set()
{'192.168.1.210'}

我希望它给你一个想法,什么是不对的代码。你应该从scanIPlistronget中减去knownIPListronget。就是这样。

非常感谢您的推荐。

问题在我提问之前就在代码中了。knownIPlist和scanIPlist是类型字符串,所以当我将它们声明为集合时,它会给出这样的输出:

{'4', '2', '9', "'", '0', '5', '1', '.', '8', '6', '7', ',', ' '}

而不是ip,所以比较它们没有任何意义。此外,这是正确的顺序,以获得我的iPhone连接我的wifi输出。

newIPlist = scanIPlist_set.difference(knownIPList_set)

相关内容

  • 没有找到相关文章

最新更新