2015-12-06 4 views
2

Я пытаюсь сделать понимание списка при анализе нескольких аргументов, которые могут быть одиночными, разделенными запятыми или нулевыми значениями.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'] 

Возможно ли расширить список с помощью другого списка?

+1

Если вы используете Python 3: '[ф для ф в [* csv_ip.split (''), single_ip, empty_ip], если ip] '. –

+0

Я использую Python 2.6 - Я думаю, это важно, что я упоминаю это для будущих сообщений .. ура! – AK47

+0

Да, но помните, что ** всегда ** используйте тег 'python', если ваш вопрос о Python. Для получения дополнительной информации просмотрите тег [* Рекомендация по метке *] (https://stackoverflow.com/tags/python-2.x/info) тега тега [tag: python-2.x]. –

ответ

4

Вы можете просто создать один плоский список до фильтрации с помощью «добавления» подсписков:

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 [])] 
+1

Ну, '[ip для ip в csv_ip.split (',') + [single_ip, empty_ip], если ip]' также отлично работает. –

+0

Это сработало для меня - если вы можете отредактировать свой ответ, чтобы включить комментарий Kevins, который был бы замечательным (поскольку я отметил это как ответ), я буду использовать это решение. Cheers – AK47

+1

Разве это не требует, чтобы вы знали, какие аргументы являются одним IP или «Нет»? – TigerhawkT3

2

Там нет никакого способа сделать фактическое 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_ip и empty_ip в список.

0

Поскольку все дело в том, что вы не знаете, какие аргументы будут содержать разделенные запятыми 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 
Смежные вопросы