将新设置项添加到列表时,顺序不一致

时间:2018-04-14 19:50:27

标签: python python-3.x list set

我从一个文件中读取了ip地址,并将它们与bool值一起插入到一个集合中,然后错误地将它们插入#39; False'。我使用'添加'功能。 然后我将该集插入列表中。 我希望获得的列表示例:  [{1.2.3.5,FALSE},{10.10.10.1,FALSE}] 但有时我看到IP地址和bool的顺序发生了变化。 这是代码

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'}]

正如您可以在集合中的第三个值中看到的那样 - 订单已切换,我不知道原因。 我想请你解释它为什么会发生。 谢谢, 欧米。

2 个答案:

答案 0 :(得分:3)

Sets are unordered.您不能也不应该期望以特定顺序打印集合的输出。

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

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

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

答案 1 :(得分:0)

集合是无序的,因为它们使用散列函数将项目插入其中。 您可以使用表示ips作为键的字典和bool值作为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。