我想从一个列表中按IP地址收集端口。
_list = [
[5, '255.255.255.0', 'dell', '744-1'],
[6, '255.255.255.0', 'dell', '744-1'],
[7, '255.255.255.1', 'amd', 'None'],
[8, '255.255.255.1', 'amd', 'None']
]
所得到的列表应该是这样的格式:
result_list = [['255.255.255.0', 5, 6], ['255.255.255.1', 7, 8]]
处理这个问题的最合理的方法是建立一个以地址为键,端口为值的列表的字典。您可以用普通的 Python dict
但这恰恰是一种情况,在这种情况下。defaultdict
简化了你的逻辑,因为如果一个键已经存在一个列表,它将追加到列表中,或者将创建一个新的key:list对并将值添加到列表中,而无需你自己在代码中处理创建新的key:list对。
from collections import defaultdict
d = defaultdict(list)
for port, address, _, _ in _list:
d[address].append(port)
out_list = [[k] + v for k, v in d.items()]
上面这段代码的第一部分将你所有的数据收集到了一个叫做 defaultdict
其中包含了作为键的地址和作为值的端口列表。
defaultdict(list, {'255.255.255.0': [5, 6], '255.255.255.1': [7, 8]})
如果你评估一下你的要求, 很可能一个字典就能满足你的要求. 然而,您可以重新格式化,将其完全按照您在问题中指定的列表理解。
[['255.255.255.0', 5, 6], ['255.255.255.1', 7, 8]]