如何从嵌套列表中按 IP 地址提取端口

How to extract ports by IP address from nested lists

我想按 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]]