在列表中按规律插入字符
我想把 10000000C9ABCDEF
转换成 10:00:00:00:c9:ab:cd:ef
这种格式。
这样做的原因是,当我登录到我的存储设备时,看到的格式是 10000000C9ABCDEF
,这是主机总线适配器(HBA)的显示方式。但SAN交换机却是用 10:00:00:00:c9:ab:cd:ef
这种格式来理解的。
到目前为止,我只能做到以下这些:
#script to convert WWNs to lowercase and add the :.
def wwn_convert():
while True:
wwn = (input('Enter the WWN or q to quit- '))
list_wwn = list(wwn)
list_wwn = [x.lower() for x in list_wwn]
lower_wwn = ''.join(list_wwn)
print(lower_wwn)
if wwn == 'q':
break
wwn_convert()
我尝试过用 ':'.join
,但这样会在每个字符后面都加上 :
,结果变成了 1:0:0:0:0:0:0:0:c:9:a:b:c:d:e:f
。
我想让 .join
通过一个循环来处理,比如我可以写 for i in range (0, 15, 2)
,这样就能在每两个字符后面插入一个 :
,但我不太确定该怎么做。(好在Python允许我以2或其他任何我想要的数字来循环。)
另外,如果有人能给我一些建议,让我能更好地写这个脚本,我会非常感激...
请帮帮我。
我在Windows 7(64位)上使用的是Python 3.2.2版本。
6 个回答
我觉得对你最有帮助的是Python中的一个叫做“切片”的概念。你可以在任何可迭代的对象上使用切片,包括字符串,这让它们非常实用,学会使用切片通常是个很不错的主意。
>>> s = '10000000C9ABCDEF'
>>> [s.lower()[i:i+2] for i in range(0, len(s)-1, 2)]
['10', '00', '00', '00', 'c9', 'ab', 'cd', 'ef']
>>> ':'.join([s.lower()[i:i+2] for i in range(0, len(s)-1, 2)])
'10:00:00:00:c9:ab:cd:ef'
>>> s = '10000000C9ABCDEF'
>>> ':'.join([s[x:x+2] for x in range(0, len(s)-1, 2)])
'10:00:00:00:C9:AB:CD:EF'
解释:
':'.join(...)
这个方法会把你给的每一部分用 ':' 连接起来,形成一个新的字符串。
s[x:x+2]
这个方法会从字符串 s 中提取出从位置 x 开始的长度为 2 的子字符串。
range(0, len(s) - 1, 2)
这个方法会生成一个从 0 开始到字符串 s 的长度减 1 的整数列表,步长为 2。
所以,列表推导式会把字符串 s 分割成长度为 2 的小部分,然后 join
方法会把这些小部分重新连接起来,中间用 ':' 分隔。
这里还有一个选择:
>>> s = '10000000c9abcdef'
>>> ':'.join(a + b for a, b in zip(*[iter(s)]*2))
'10:00:00:00:c9:ab:cd:ef'
或者可以更简洁一些:
>>> import re
>>> ':'.join(re.findall('..', s))
'10:00:00:00:c9:ab:cd:ef'