Пара IP-адресов в списке, извлеченном из xlrd

Я использовал xlrd для извлечения данных из столбца (данные ниже). Мне нужно сгруппировать IP-адреса. Таким образом, IP-адреса, которые появляются рядом в выводе, принадлежат одному и тому же пулу, а отдельные — в собственном пуле. Например, (10.100.33.183,10.100.33.184) принадлежат (pool1). (Пул6 = 10.100.33.89)

Как мне добиться этого, вся помощь приветствуется.

['', '', '', '', '', '', '', 'IP-адрес члена пула', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', ' ', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100 .33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', ' ', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '' , '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']


person degixer    schedule 06.07.2017    source источник
comment
Вы должны сделать это как часть извлечения ваших данных из Excel.   -  person cs95    schedule 06.07.2017
comment
Делая следующие предположения: 1: Вы не можете сгруппировать адреса по пулу при получении ответа xlrd. 3: Отдельным адресам без пула предшествуют и замещаются пустые строки. 4: Адрес не повторяется в ответе. Верны ли эти предположения?   -  person BoboDarph    schedule 06.07.2017


Ответы (3)


ip_data = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
ip_pools = [[]]  # it starts as a list with an empty list at its last (and only) index
for ip_address in ip_data[ip_data.index('Pool Member IP')+1:]:
    if not ip_address:  # ip_address is ''
        if ip_pools[-1]:  # the last element of ip_pools is NOT an empty list: []
            ip_pools.append([])  # for the next ip pool
    else:  # ip_address is not empty
        # ip_pools[-1].append(ip_address)  # if you need the whole text
        ip_pools[-1].append(ip_address.partition(' ')[0])  # if you just want the number
if [] in ip_pools:
    ip_pools.remove([])  # to remove last empty list (if exists)

РЕДАКТИРОВАТЬ: исправлено предложение

person francisco sollima    schedule 06.07.2017
comment
Спасибо, очень помогло и быстро. Я два дня никуда не спешил!!! - person degixer; 06.07.2017
comment
Я имел в виду, что это больше не было помечено как правильное. Но ничего страшного, вы вправе выбрать ответ, который лучше всего соответствует вашему вопросу. - person francisco sollima; 20.09.2017
comment
это должно быть было ошибкой с моей стороны, так как я пытался посмотреть на это снова - person degixer; 20.09.2017
comment
любые изменения, которые вы могли бы внести в другой аналогичный вопрос список после импорта xlrd"> stackoverflow.com/questions/46317317/ - person degixer; 20.09.2017

Решение @franciscosollima хорошее. Вот еще один способ с регулярным выражением.

iplist = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

import re

p = re.compile('[\d]+(?:\.[\d]+){3}')

pools = [[]]

for ip in iplist:
    m = p.match(ip)
    if m:
        pools[-1].append(m.group(0))
    elif not pools[-1]:
        continue
    else:
        pools.append([])

if [] in pools:
    pools.remove([])

for i, p in enumerate(pools, 1):
    print("Group " + str(i) +": " + str(p))

Это так же просто, как добавить последовательные совпадения в один и тот же пул. В противном случае инициализируйте новый. Шаблон регулярного выражения будет совпадать с самого начала, и вы также можете настроить его для обнаружения адресов IPv6.

Распечатывает:

Group 1: ['10.100.33.184', '10.100.33.183']
Group 2: ['10.101.33.182', '10.100.33.181']
Group 3: ['10.100.33.180', '10.100.33.179']
Group 4: ['10.100.33.178', '10.100.33.177']
Group 5: ['10.100.33.90']
Group 6: ['10.100.33.89']
Group 7: ['10.100.33.91']
person cs95    schedule 06.07.2017
comment
Отличное решение, очень чисто, мне нравится. спасибо coldspeed - person degixer; 06.07.2017

Могу я немного поиграть с itertools для ответа?

test = ['', '', '', '', '', '', '', 'Pool Member IP', '', '10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)', '', '', '', '', '', '', '', '10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)', '', '', '', '', '', '', '', '10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)', '', '', '', '', '', '', '', '10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)', '', '', '', '', '', '', '', '10.100.33.90 (S56723FR6VL09)', '', '', '', '', '', '', '', '', '10.100.33.89 (S56723FR6VL0A)', '', '', '', '', '', '', '', '', '10.100.33.91 (S56723FR6VW01)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
import itertools
def isplit(iterable,splitters):
    return [list(g) for k,g in itertools.groupby(iterable,lambda x:x in splitters) if not k]
test.remove('Pool Member IP')
pool = 0
for list in isplit(test,''):
    if len(list):
        pool+=1
    print(pool, list)

Распечатывает:

1 ['10.100.33.184 (S56723FR6VL01)', '10.100.33.183 (S56723FR6VL02)']
2 ['10.101.33.182 (S56723FR6VL03)', '10.100.33.181 (S56723FR6VL04)']
3 ['10.100.33.180 (S56723FR6VL05)', '10.100.33.179 (S56723FR6VL06)']
4 ['10.100.33.178 (S56723FR6VL07)', '10.100.33.177 (S56723FR6VL08)']
5 ['10.100.33.90 (S56723FR6VL09)']
6 ['10.100.33.89 (S56723FR6VL0A)']
7 ['10.100.33.91 (S56723FR6VW01)']

Престижность Разбить список на вложенные списки по значению и гугл-фу

person BoboDarph    schedule 06.07.2017
comment
Спасибо, БобоДарф, я только что посмотрел эту ссылку - person degixer; 06.07.2017
comment
В основном все, что я сделал, это нашел способ разбить список на подсписки на основе элемента списка (который в вашем случае является пустым элементом - ''), а затем увеличить счетчик и распечатать подсписок для каждого непустого подсписка. И извлеките все ненужные вещи из списка (в вашем случае это строка «IP-адрес члена пула»). - person BoboDarph; 06.07.2017