我从一个文件中读取了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'}]
正如您可以在集合中的第三个值中看到的那样 - 订单已切换,我不知道原因。 我想请你解释它为什么会发生。 谢谢, 欧米。
答案 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]
列出清单。 list
和tuple
之间的主要区别是列表是可变的,而元组是不可变的。
答案 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。