繁体   English   中英

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

[英]Why is my Python program not finding the difference between the two sets?

我能够在我的 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...")

output 是:

'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 ()”。 这只是一个空集。 为什么不将 new.210 IP 地址添加和打印到 newIPlist?

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")

@布兰登

您正在尝试相反的操作,这就是您得到空集的原因。 要弄清楚,请运行以下代码段:

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)

output 如下:

set()
{'192.168.1.210'}

我希望它可以让您了解您的代码中有什么不正确的地方。 您应该从 scanIPlist_set 中减去 knownIPList_set。 而已。

非常感谢您的所有建议。

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

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

而不是IP,所以比较它们并没有做任何事情。 此外,这是让我的 iPhone 的 output 加入我的 wifi 的正确顺序。

newIPlist = scanIPlist_set.difference(knownIPList_set)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM