Python 比较列表并提取数字

Python 比较列表并提取数字,python,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地址放在一个列表中,新闻集,像这样 范例 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 等等 然后我使用下面的代码弹出子网掩

我正在尝试获取一个包含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地址放在一个列表中,新闻集,像这样

范例 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循环进行比较,但我很确定这不会起作用

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 
您可以使用一个字典,它非常适合于唯一的
键、值
配对,只需进行您想要的检查,然后将地址重新组合成一个列表

更新的\u列表
将是唯一的IP地址列表,这些IP地址具有该IP的最小子网


ip_dict.values()
提供了这些唯一ip的子网列表。

您应该将ip/子网列表解析为一个dict,ip作为密钥,一组子网作为值。然后,您将迭代这些键,找到子网集合上的最小值,并将计算仅应用于该ip/子网

大概是这样的:

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

我运行了代码,但在集合上出现了一个错误,特别是“集合”不是defined@John它适用于我的设置和python版本2.7.5。@John不,所有内容都是标准的。你收到了什么错误?上面的代码在我的机器上运行正常。@John我修复了一个被忽略的
SyntaxError
现在应该可以正常工作了,如果仍然看到错误,请告诉我。