繁体   English   中英

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']

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

您可以在通过“添加”子列表进行过滤之前只创建一个平面列表:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM