我有一个.csv文件,其中包含少数数据中心的IP地址列表.该列表目前看起来类似于下表:
Data_Center_Name IP
DC_1 52.102.182.2
DC_1 52.102.182.4
DC_1 52.102.182.1
DC_1 52.102.182.5
DC_1 52.102.182.3
DC_1 27.101.178.17
DC_1 27.101.178.16
DC_1 27.101.178.15
DC_1 23.201.165.7
DC_2 55.200.162.10
DC_2 55.200.162.12
DC_2 55.200.162.13
DC_2 55.200.162.11
DC_3 30.101.102.4
Run Code Online (Sandbox Code Playgroud)
我想将列表转换为单个列表,例如:
DC_1 = [52.102.182.1-52.102.182.5,
27.101.178.15-27.101.178.17,
23.201.165.7]
DC_2 = [55.200.162.10-55.200.162.13]
DC_3 = [30.101.102.4]
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我使用python吗?
使用python3(如果需要,我可以使用python2)
\n\n利用ipaddress和groupby内置库以及其他内置功能:
def create_range(ip_addresses):\n groups=[]\n for _, g in itertools.groupby(enumerate(sorted(ip_addresses)), lambda (i,x):i-int(x)):\n group = map(operator.itemgetter(1), g)\n if len(group) > 1:\n groups.append("{}-{}".format(group[0], str(group[-1]).split(\'.\')[-1]))\n else:\n groups.append(str(group[0]))\n return groups\nRun Code Online (Sandbox Code Playgroud)\n\nStringIO模拟从文件中读取):import csv ## for reading csv file\nimport ipaddress ## for creating ip address objects\nimport io ## for mimicking reading csv file\nimport operator ## for grouping operation\nimport itertools ## for grouping operation\nimport collections ## for creating a defaultdict\n\nips = defaultdict(list)\ncsv_file = u"""Data_Center_Name, IP\n DC_1, 50.102.182.2\n DC_1, 52.102.182.4\n DC_1, 52.102.182.1\n DC_1, 52.102.182.5\n DC_1, 52.102.182.3\n DC_1, 27.101.178.17\n DC_1, 27.101.178.16\n DC_1, 27.101.178.15\n DC_1, 23.201.165.7\n DC_2, 55.200.162.10\n DC_2, 55.200.162.12\n DC_2, 55.200.162.13\n DC_2, 55.200.162.11\n DC_3, 30.101.102.4\n"""\n\nwith io.StringIO(csv_file) as f:\n reader = list(csv.reader(f))\n for (dc, ip) in reader[1:]:\n ip = ipaddress.IPv4Address(unicode(ip.strip()))\n ips[dc.strip()].append(ip)\n result = {dc: create_range(ip_range) for dc, ip_range in ips.items()}\nRun Code Online (Sandbox Code Playgroud)\n\nIn [92]: result\nOut[92]:\n{\'DC_1\': [\'23.201.165.7\',\n \'27.101.178.15-17\',\n \'50.102.182.2\',\n \'52.102.182.1\',\n \'52.102.182.3-5\'],\n \'DC_2\': [\'55.200.162.10-13\'],\n \'DC_3\': [\'30.101.102.4\']}\nRun Code Online (Sandbox Code Playgroud)\n\nimport csv ## for reading csv file\nimport ipaddress ## for creating ip address objects\nfrom StringIO import StringIO ## for mimicking reading csv file\nimport operator ## for grouping operation\nimport itertools ## for grouping operation\nimport collections ## for creating a defaultdict\n\ndef create_range(ip_addresses):\n groups=[]\n for _, g in itertools.groupby(enumerate(sorted(ip_addresses)), lambda (i,x):i-int(x)):\n group = map(operator.itemgetter(1), g)\n if len(group) > 1:\n groups.append("{}-{}".format(group[0], str(group[-1]).split(\'.\')[-1]))\n else:\n groups.append(str(group[0]))\n return groups\n\nips = collections.defaultdict(list)\n\ncsv_file = """Data_Center_Name, IP\n DC_1, 50.102.182.2\n DC_1, 52.102.182.4\n DC_1, 52.102.182.1\n DC_1, 52.102.182.5\n DC_1, 52.102.182.3\n DC_1, 27.101.178.17\n DC_1, 27.101.178.16\n DC_1, 27.101.178.15\n DC_1, 23.201.165.7\n DC_2, 55.200.162.10\n DC_2, 55.200.162.12\n DC_2, 55.200.162.13\n DC_2, 55.200.162.11\n DC_3, 30.101.102.4\n"""\n\nreader = csv.reader(StringIO(csv_file))\nnext(reader)\nfor (dc, ip) in reader:\n ip = ipaddress.IPv4Address(unicode(ip.strip()))\n ips[dc.strip()].append(ip)\nresult = {dc: create_range(ip_range) for dc, ip_range in ips.items()}\nRun Code Online (Sandbox Code Playgroud)\n\nprint result\n{\'DC_2\': [\'55.200.162.10-13\'], \'DC_3\': [\'30.101.102.4\'], \'DC_1\': [\'23.201.165.7\', \'27.101.178.15-17\', \'50.102.182.2\', \'52.102.182.1\', \'52.102.182.3-5\']}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n确实有效!谢谢。可以得到输出:{\'DC_2\': [\'55.200.162.10-55.200.162.13\'], \'DC_3\': [\'30.101.102.4\'], \'DC_1\' :[\'23.201.165.7\'、\'27.101.178.15-27.101.178.17\'、\'50.102.182.2\'、\'52.102.182.1\'、\'52.102.182.3-52.102.182.5\'] } \xe2\x80\x93
\n
是的,更改这一行:
\n\ngroups.append("{}-{}".format(group[0], str(group[-1]).split(\'.\')[-1]))\nRun Code Online (Sandbox Code Playgroud)\n\n对此:
\n\ngroups.append("{}-{}".format(group[0], group[-1]))\nRun Code Online (Sandbox Code Playgroud)\n