Python 扩展列表理解

Python Extend List Comprehension

我正在尝试在解析多个参数时进行列表理解,这些参数可以是单个值、逗号分隔值或空值。

以下是一段简短的工作代码:

csv_ip = '192.168.1.1,192.168.1.20'
single_ip = '33.44.33.22'
empty_ip = None

ip_list = [ip for ip in [csv_ip.split(','), single_ip, empty_ip] if ip]
print ip_list
>> [['192.168.1.1', '192.168.1.20'], '33.44.33.22']

我想知道在拆分CSV值时是否可以扩展列表,以便列表如下:

['192.168.1.1', '192.168.1.20', '33.44.33.22']

是否可以用另一个列表扩展列表理解?

您可以在按 "adding" 个子列表过滤之前只创建一个平面列表:

csv_ip = '192.168.1.1,192.168.1.20'
single_ip = '33.44.33.22'
empty_ip = None

ip_list = [ip for ip in csv_ip.split(',') + [single_ip] + [empty_ip] if ip]
print ip_list
>>> ['192.168.1.1', '192.168.1.20', '33.44.33.22']

如果您想要一个对所有参数情况都一视同仁的版本,您可以使用:

ip_list = [ip for s in [csv_ip, single_ip, empty_ip] for ip in (s.split(",") if s else [])]

无法实现实际的 extend,但您可以使用 itertools.chain

获得相同的结果
from itertools import chain

ip_list = [ip for ip in chain(csv_ip.split(','), [single_ip, empty_ip]) if ip]

itertools.chain 接受一堆迭代器,然后遍历第一个的所有元素,然后是第二个,依此类推,所以你需要发送 single_ipempty_ip也在列表中。

因为重点是您不知道哪些参数将包含逗号分隔的 IP,哪些将包含单个 IP,哪些将包含 None,如果您尝试硬编码他们的行为。相反,检查每个参数并适当地处理它:

csv_ip = '192.168.1.1,192.168.1.20'
single_ip = '33.44.33.22'
empty_ip = None
args = csv_ip, single_ip, empty_ip
result = [item for arg in args for item in (arg.split(',') if arg else '')]

结果:

>>> for item in result:
...     print(item)
...
192.168.1.1
192.168.1.20
33.44.33.22