python:解析vlan资源池....

Vlan是一种为局域网设备进行逻辑划分的技术,为了标识不同的vlan 引入了vlan id 1~4094之间的整数,定义一个vlan id 的资源池

资源池中连续的vlan用开始vlan-结束vlan表示,不连续的用单个整数表示所有的vlan用英文逗号连接起来

现有一个vlan资源池,业务需要从资源池中申请一个vlan,需要你输出从vlan资源池中移除申请的vlan后的资源池

输入描述

第一行为字符串格式的vlan资源池,第二行为业务要申请的vlan vlan的取值范围1~4094

输出描述

从输入vlan资源池中移除申请的vlan后字符串格式的vlan资源池,输出要求满足题目中要求的格式,

并且要求从小到大升序输出,如果申请的vlan不在原资源池,输出升序排序的原资源池的字符串即可

输入池中vlan数量范围为2~2094的整数,资源池中vlan不重复且合法1~2094的整数

输入是乱序的

示例一

输入
1-5
2

输出
1,3-5
说明:原vlan资源池中有1 2 3 4 5 移除2后
剩下的1 3 4 5按照升序排列的方式为 1 3-5

示例二
输入
20-21,15,18,30,5-10
15
输出
5-10,18,20-21,30
说明:
原vlan资源池中有5 6 7 8 9 10 15 18 20 21 30
移除15后 剩下的为 5 6 7 8 9 10 18 20 21 30
按照题目描述格式并升序后的结果为5-10,18,20-21,30

示例三
输入
5,1-3
10
输出
1-3,5
资源池中有1 2 3 5
申请的资源不在资源池中
将原池升序输出为1-3,5

 

 

 1 # coding:utf-8
 2 def appends(result, start, last):
 3     if start == last:
 4         result.append(str(last))
 5     else:
 6         result.append("-".join([str(start), str(last)]))
 7 
 8 
 9 if __name__ == '__main__':
10     input_str = input("input string:")
11     request = int(input("Remove:"))
12 
13     result = []
14     sets = set()
15     for string in input_str.split(','):
16         if "-" in string:
17             ss = string.split("-")
18             for i in range(int(ss[0]), int(ss[1])+1):
19                 sets.add(int(i))
20         else:
21             sets.add(int(string))
22     try:
23         sets.remove(request)
24     except NameError:
25         pass
26 
27     last = start = list(sets)[0]
28     for i in range(1, len(sets)):
29         cur = list(sets)[i]
30         if cur == last+1:
31             last = cur
32         else:
33             appends(result, start, last)
34             start = last = cur
35 
36     appends(result, start, last)
37     print(sorted(set(result)))

 

posted @ 2022-01-25 14:41  一只小麻瓜  阅读(832)  评论(0编辑  收藏  举报