我能够成功地获得我的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)