You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从混合元素的嵌套列表中提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:37:00