比较列表并提取数字

时间:2014-07-31 22:49:09

标签: python

我正在尝试获取包含IP地址'和子网掩码(1.0.0.0/24)的列表,并计算该列表中的IP地址总数。但是,我试图避免计算相同的IP地址,但具有更高的子网掩码。

实施例 1.0.0.0/24 1.0.0.0/16 1.0.0.0/8

这里我只想使用/ 8来计算IP地址,因为它包含/ 16和/ 24

我已将所有IP地址放在一个列表newSet中,就像这样......

实施例 1.0.0.0/24 1.0.0.0/16 1.0.0.0/8 2.0.0.0/24 2.0.0.0/16 等....

然后我使用下面的代码弹出子网掩码/ 24,/ 16,/ 8等...就像这样

subIP = [i.split('/', 1)[1] for i in newSet]

然后我通过ipTotal计算IP空间全局声明

for element in subIP:
   y = 32 - int(element)
   x = pow(2, y)
   ipTotal = ipTotal + x 

但是我现在正在计算1.0.0.0/24,1.0.0.0/16和1.0.0.0/8,而我需要做的就是计算1.0.0.0/8。

基本上我在计算IP空间的数量。

我该如何处理?我想把1.0.0.0放到一个列表中,然后把/ 24放到另一个列表中...然后运行一个嵌套的for循环进行比较,但我很确定这不起作用。

2 个答案:

答案 0 :(得分:1)

ip_dict = {}
for ip_subnet in newSet:
    ip,subnet = ip_subnet.split('/')
    subnet = int(subnet)
    if ip not in ip_dict or ip_dict[ip] > subnet:
        ip_dict[ip] = subnet
updated_list = [str(ip)+"/"+str(subnet) for ip,subnet in ip_dict.iteritems()]

ipTotal = 0
for subnet in ip_dict.values():
    y = 32 - int(subnet)
    x = pow(2, y)
    ipTotal = ipTotal + x 

您使用的词典非常适合唯一的key,value配对,只需进行您想要的检查,然后将地址重新设置回列表中。

updated_list将是具有该IP最小子网的唯一IP地址列表。

ip_dict.values()列出了这些唯一IP的子网。

答案 1 :(得分:0)

您应该将ip / subnet列表解析为dict,ip为密钥,一组子网为值。然后,您将遍历密钥,在子网集上找到最小值,并将计算应用于该ip / subnet。

这样的事情:

import collections

ip_subnet_list=['1.0.0.0/31', '1.0.0.0/30', '5.0.0.0/22']
data = collections.defaultdict(set)
for item in ip_subnet_list:
  ip, subnet = item.split('/')
  data[ip].add(int(subnet))

ip_count = 0
for ip, subnets in data.iteritems():
  subnet = min(subnets)
  ip_count += pow(2, 32 - subnet)
print ip_count