Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在从xlrd提取的列表中配对IP地址_Python_List_Keyvaluepair - Fatal编程技术网

Python 在从xlrd提取的列表中配对IP地址

Python 在从xlrd提取的列表中配对IP地址,python,list,keyvaluepair,Python,List,Keyvaluepair,我使用xlrd从列中提取数据(下面的数据)。我需要将ip地址分组。因此,在输出中显示在一起的ip地址属于同一个池,而单个ip地址则位于它们自己的池中。例如(10.100.33.183,10.100.33.184)属于(池1)。(池6=10.100.33.89) 我该如何实现这一目标 [“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,池成员IP’,“”,“”,“”,“”,“”,10.101.33.182(S56723FR

我使用xlrd从列中提取数据(下面的数据)。我需要将ip地址分组。因此,在输出中显示在一起的ip地址属于同一个池,而单个ip地址则位于它们自己的池中。例如(10.100.33.183,10.100.33.184)属于(池1)。(池6=10.100.33.89)

我该如何实现这一目标

[“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,池成员IP’,“”,“”,“”,“”,“”,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.178","10.100.33.89(S56723FR6VL0A"),",",",",",",,",",,

编辑:修正了句子的错误


编辑:更正句子

@Franciscosolima的解决方案很好。这里有另一种使用正则表达式的方法

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))
只需将连续的匹配项添加到同一个池中即可。否则,请初始化一个新的。regex模式将从一开始就匹配,您可以将其配置为检测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']
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)']

@方济各索利玛的解决方案是好的。这里有另一种使用正则表达式的方法

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))
只需将连续的匹配项添加到同一个池中即可。否则,请初始化一个新的。regex模式将从一开始就匹配,您可以将其配置为检测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']
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)']
ips=[ip.split()[0]用于ip数据中的ip,如果ip[0]。isdigit()]
sort=sorted(ips,key=lambda ip:int(ip.split('.')[-1]))
i、 l,c=0,len(排序),1
池={}
而我
ips=[ip.split()[0]用于ip数据中的ip,如果ip[0]。isdigit()]
sort=sorted(ips,key=lambda ip:int(ip.split('.')[-1]))
i、 l,c=0,len(排序),1
池={}
而我
我可以用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)
打印出:

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

感谢google fu和google fu我可以玩一下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)
打印出:

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


感谢google fu和google fu

您应该这样做,作为从excel中提取数据的一部分。做出以下假设:1:在获得xlrd响应时,您无法按池对地址进行分组。3:没有池的单个地址前面有空字符串,并用空字符串替换。4:回复中不要重复地址。这些假设是否正确?在从excel中提取数据时,您应该这样做。做出以下假设:1:在获取xlrd响应时,您无法按池对地址进行分组。3:没有池的单个地址前面有空字符串,并用空字符串替换。4:回复中不要重复地址。这些假设正确吗?谢谢,这非常有帮助,也很快。我花了两天的时间,什么也没得到!!!我的意思是它不再被标记为正确。但是没关系,你有权选择最适合你的问题的答案。这肯定是我的错误,因为我试图重新审视它。你可以用另一个类似的问题来改变它@francisco Thance,这也是非常有帮助和快速的。我花了两天的时间,什么也没得到!!!我的意思是它不再被标记为正确。但没关系,你有权选择最适合你的问题的答案。这一定是我的错误,因为我正试图重新审视它。你可以用另一个类似的问题@francisco Great solution,非常干净,我喜欢。感谢coldspeedGreat solution,非常干净,我喜欢它。感谢ColdspeedHanks BoboDarph,我刚刚给了那个链接一个外观基本上我所做的就是找到一种方法,根据一个列表项(在你的例子中是空元素-“”)将列表拆分成子列表,然后增加一个计数器,并为每个非空子列表打印子列表。然后从列表中弹出所有不需要的内容(在您的示例中是“Pool member IP”字符串)。感谢BoboDarph,我刚刚查看了该链接基本上我所做的就是找到一种方法,根据列表项(在您的示例中是空元素-“”)将列表拆分为子列表然后增加计数器并打印每个非空子列表的子列表。然后从列表中弹出所有不需要的内容(在您的例子中是“Pool member IP”字符串)。