分类:字符串
知识点:
-
字符串是否由数字组成 my_str.isdigit()
-
字符串填充 不足8位左侧填充0 my_str.zfill(8)
题目来自【牛客】
import sys
def classify_ip(ip_mask): ip_class, is_private_ip, mask_class = 'ignore_ip', 0, 'valid_mask'# 解析IP地址和子网掩码 ip, mask = ip_mask.split('~') ip_parts = ip.split('.') mask_parts = mask.split('.')# 验证IP地址是否合法 if len(ip_parts) != 4: ip_class = 'error_ip' for part in ip_parts: if not part.isdigit() or int(part) < 0 or int(part) > 255: ip_class = 'error_ip' # 验证子网掩码是否合法 if len(mask_parts) != 4: mask_class = 'error_mask' for part in mask_parts: if not part.isdigit() or int(part) < 0 or int(part) > 255: mask_class = 'error_mask' # zfill() 是字符串(str)对象的一个方法,用于在字符串的左侧填充零zero,直到字符串达到指定的长度。mask_binary = ''.join([bin(int(part))[2:].zfill(8) for part in mask_parts])# rfind() 是 Python 中字符串(str)对象的一个方法,用于在字符串中从右向左查找子字符串,# 并返回子字符串的最后一个匹配的索引。如果找不到子字符串,则返回 -1。# print(mask_binary)if '01' in mask_binary or mask_binary.count('1') == 0 or mask_binary.count('0') == 0:mask_class = 'error_mask'# IP地址分类 if ip_class != 'error_ip':# 判断是否为私有IPif int(ip_parts[0]) == 10 or (int(ip_parts[0]) == 172 and 16 <= int(ip_parts[1]) <= 31):is_private_ip = 1# 判断IP地址所属的类别if 1 <= int(ip_parts[0]) <= 126:ip_class = 'A'elif 128 <= int(ip_parts[0]) <= 191:ip_class= 'B'elif 192 <= int(ip_parts[0]) <= 223:ip_class = 'C'elif 224 <= int(ip_parts[0]) <= 239:ip_class = 'D'elif 240 <= int(ip_parts[0]) <= 255:ip_class = 'E'else:ip_class = 'ignore_ip'return ip_class, is_private_ip, mask_classcount = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'error_ip': 0, 'error_mask': 0, 'private': 0, 'ignore_ip': 0}
for line in sys.stdin:ip_mask = line.strip()# print(ip_mask)ip_class, is_private_ip, mask_class = classify_ip(ip_mask)# print(ip_class, is_private_ip, mask_class)if ip_class == 'ignore_ip':count['ignore_ip'] += 1elif ip_class == 'error_ip':count['error_ip'] += 1elif mask_class == 'error_mask':count['error_mask'] += 1else:count[ip_class] += 1if is_private_ip == 1:count['private'] += 1print(count['A'], count['B'], count['C'], count['D'], count['E'], count['error_ip'] + count['error_mask'], count['private'])