我从文件中读取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]
.list
和 tuple
之间的主要区别在于列表是可变的,而元组是不可变的。
是无序的,因为它们使用哈希函数将项目插入其中。您可以使用字典将 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 。