在将新的集合项添加到列表中时,顺序并不一致



我从文件中读取IP地址并将它们与布尔值"False"一起插入到一个集合中。我使用"添加"功能。然后我将集合插入到列表中。我想得到的列表示例: [{1.2.3.5,False},{10.10.10.1,False}]但有时我看到 IP 地址和布尔值的顺序发生了变化。这是代码

def createIpSet(ipFile):
    ipList = []
    ipFile = ipFile.read().splitlines()
    for lines in ipFile:
        s = set()
        s.add(lines)
        s.add(False)
        ipList.append(s)
    print(ipList)   
    return ipList

这是输出的示例

[{False, '192.168.1.1'}, {False, '192.168.1.2'}, {'192.168.1.3', False}, {'192.168.1.3', False}, {'192.168.1.4', False}, {False, '127.0.0.1'}, {False, '52.230.85.180'}, {False, '53.27.2.1'}, {False, '52.230.84.0'}]

例如,正如您在集合内的第三个值中看到的那样 - 顺序被切换,我不知道为什么。我想让你解释一下为什么会发生这种情况。谢谢奥姆里。

集合是无序的。您不能也不应该期望以特定顺序打印集的输出。

你想要的是一个元组列表:

def createIpSet(ipFile):
    ipList = []
    ipFile = ipFile.read().splitlines()
    for lines in ipFile:
        ipList.append((lines, False))
    print(ipList)   
    return ipList
列表

列表同样可以通过 [lines, False] .listtuple 之间的主要区别在于列表是可变的,而元组是不可变的。

集合

是无序的,因为它们使用哈希函数将项目插入其中。您可以使用字典将 ips 表示为键,将布尔值表示为vaules。它看起来像

{'192.168.1.3': False, '192.168.1.4' : False }

使用字典与元组列表的优点是,搜索或查找 ip 将花费 O(1( 时间与 O(n( 元组列表。

def createIpSet(ipFile):
    ipList = {}
    ipFile = ipFile.read().splitlines()
    for lines in ipFile:
        ipList[lines] =  False
    for ip ,value in ipList :
        print('Ip : {} ,value : {} '.format(ip , value))
    return ipList

以pythonic的方式使用理解:

def createIpSet(ipFile):
    ipList = {ip:False for ip in ipFile.read().splitlines()}
    for ip ,value in ipList :
        print('Ip : {} ,value : {} '.format(ip , value))
    return ipList

如果要将 ips 的顺序保留为文件,则可以使用 OrderedDict 。

最新更新