python列表转换为字符串方法_2019-05-13 把列表转换成字符串的四种方式

上次说python是干啥的,简单理解就是通过各种方式搜集数据,进行数据处理,最后输出的一门工具语言。

其中经常用到的,比如把列表转成字符串,再把字符串处理后重新生成列表。下面以使用ip地址,生成isis的network为例来说明。

我们知道isis 的网络号通常是这样:“49.0001.0912.0908.6001.00”, 其中“0912.0908.6001” 这一段,通常是把loopback地址先补足3位,再分成3端算出来,比如192.168.10.1, 先变成192.168.010.001,去掉“.”,再按4位分割则是: 1921.6801.0001,网络号就是“49.0001.1921.6801.0001.00”

好了,那么先输入的IP地址"192.168.10.1"是一个字符串,首先按"."分割:

ip_list = ip.split('.')

然后补0到3位。由于数据比较固定,就用for循环搞定:

for n in range(0,4):

if len(ip_list[n]) == 3:

ip_list[n] = ip_list[n]

if len(ip_list[n]) == 2:

ip_list[n] = "0" + ip_list[n]

print(ip_list[n])

if len(ip_list[n]) == 1:

ip_list[n] = "00" + ip_list[n]

print(ip_list[n])

现在要ip_list是一个列表["192", "168", "110", "001"],说到正题,有三种方式可以把列表加起来:

1、最常见的是用for循环

net1 = ''

for i in ip_list:

net1 = net1 + i

print net1

这种方式的弊端是效率较低,因为在循环连接字符串的时候,每次都要重新开辟空间,然后把字符串连接起来,再放入新的空间,重复循环,内存操作比较频繁,效率低。数据量大的时候,会表现的很明显。

2、建议使用 join,最为简洁

net2 = ''.join(ip_list)

3、使用字符替换,

net1 = '%s%s%s%s' % tuple(ip_list)

但是你需要知道列表里有多少个值,否则会报错:

TypeError: not enough arguments for format string

现在得到了新的字符串,生成net只需按顺序取出相加即可:

net3 = "49.0001." + net1[0:4] + "." + net1[4:8] + "." + net1[8:12] + ".00"

print(net3)

4、当然也可以直接把列表里的值相加,需要对列表结构了解很清晰:

net1 = ip_list[0] + ip_list[1] +ip_list[2] + ip_list[3]

完整的脚本如下:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

#用于输入IP地址,生成ISIS网络号

from pprint import pprint

import sys

ip = input("Please input ip address : xx.xx.xx.xx : ")

def ip_net(argv):

ip_list = ip.split('.')

print(ip_list)

#判断位数,可注释掉

print(len(ip_list[0]), len(ip_list[1]) , len(ip_list[2]), len(ip_list[3]))

#不足3位的加0

for n in range(0,4):

if len(ip_list[n]) == 3:

pass

if len(ip_list[n]) == 2:

ip_list[n] = "0" + ip_list[n]

print(ip_list[n])

if len(ip_list[n]) == 1:

ip_list[n] = "00" + ip_list[n]

print(ip_list[n])

# ip_net = ip_list[0] + ip_list[1] +ip_list[2] + ip_list[3]

net1 = ''

net1 = '%s%s%s%s' % tuple(ip_list)

net2 = ''.join(ip_list)

print("This is net1 : ", '%17s'%net1)

print("This is net2 : ", '%17s'%net2)

# print("This is ip_list : ", ip_list)

# print(("This is ip_net : ", ip_net)

net3 = "49.0001." + net2[0:4] + "." + net2[4:8] + "." + net2[8:12] + ".00"

print(net3)

# print("49.0001.0912.0908.6001.00")

return(net3)

ip_net(ip)

if __name__ == "__ip_net__":

ip_net(sys.argv)

输出结果如下:

Please input ip address : xx.xx.xx.xx : 192.168.10.1

['192', '168', '10', '1']

3 3 2 1

010

001

This is net1 : 192168010001

This is net2 : 192168010001

49.0001.1921.6801.0001.00

BTW,还有一个更简单的方法,前提是IP地址基本固定,比如说我们知道IP地址都在同一个C类地址,只有最后一位不同,如192.168.10.X/24, 生成的network地址都是类似"49.0001.0912.0908.6001.00" - "49.0001.0912.0908.6254.00"这样只有倒数几位不同的,可以用一句搞定:

'49.0001.1921.6801.0{:0>3d}.00'.format(int(ip.split('.')[3]))

意思是把ip地址以"."分割成列表后,把最后一个转换成数字,"{:0>3d}"表示长度3位,左边补0, 如果是"{:0<3d}"则是右边补0。

你可能感兴趣的:(python列表转换为字符串方法_2019-05-13 把列表转换成字符串的四种方式)