簡體   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