如何从混合元素的嵌套列表中提取IPv4及保留'-'元素
提取不规则嵌套列表中的IPv4地址并保留分隔符'-'
问题背景
给定一个混合了'-'分隔符和[IPv6, IPv4]子列表的不规则嵌套列表,需要提取所有子列表中的IPv4地址(子列表第2个元素),同时保留原列表中的'-'元素。原输入列表如下:
['-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90']]
期望输出结果:
['-','172.29.1.90','172.29.1.90','172.29.1.90','172.29.1.90','172.29.1.90','172.29.1.90','-','172.29.1.90','172.29.1.90','172.29.1.90','172.29.1.90','172.29.1.90','172.29.1.90','-','172.29.1.90','172.29.1.90','172.29.1.90','172.29.1.90','-','172.29.1.90']
常规列表推导式[ip[1] for ip in host_ip_list]会因'-'不是列表类型而触发索引错误,以下是可行的解决方案:
解决方案
方法1:带条件判断的列表推导式
利用Python的三元表达式在列表推导式中区分元素类型:
host_ip_list = ['-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90']] filtered_host_ip_list = [ip[1] if isinstance(ip, list) else ip for ip in host_ip_list] print(filtered_host_ip_list)
逻辑说明:遍历原列表每个元素,若元素是列表则提取其索引为1的IPv4地址,否则直接保留原元素(即'-')。
方法2:普通循环遍历
如果需要更直观的代码逻辑,可使用for循环逐个处理元素:
host_ip_list = ['-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], ['fe80::a108:b52e:cfba:a646', '172.29.1.90'], '-', ['fe80::a108:b52e:cfba:a646', '172.29.1.90']] filtered_host_ip_list = [] for item in host_ip_list: if isinstance(item, list): filtered_host_ip_list.append(item[1]) else: filtered_host_ip_list.append(item) print(filtered_host_ip_list)
逻辑说明:初始化空列表,遍历原列表时判断元素类型,按规则添加到结果列表中。
内容的提问来源于Stack Exchange,提问作者OverflowStack
相关产品推荐
相关产品推荐

