我正在尝试将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
答案 0 :(得分:6)
这是另一种选择:
>>> 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'
答案 1 :(得分:2)
>>> 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]
返回长度为2的子字符串,从x
range(0, len(s) - 1, 2)
返回步长为2的整数列表
所以列表理解会将字符串s拆分为长度为2的子字符串,然后join
会将它们重新组合在一起,但在它们之间插入“:”。
答案 2 :(得分:1)
我认为最能帮到你的是python中的一个名为slice的构造。我相信你可以在任何可迭代的对象上使用它们,包括字符串,使它们非常有用,并且知道如何使用通常是个好主意。
>>> 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'
如果您想阅读更多关于切片的内容,我们会非常好地解释in this question,以及实际python documentation.
的一部分答案 3 :(得分:1)
>>> s='10000000C9ABCDEF'
>>> si=iter(s)
>>> ':'.join(c.lower()+next(si).lower() for c in si)
>>> '10:00:00:00:c9:ab:cd:ef'
以lambda形式:
>>> (lambda x: ':'.join(c.lower()+next(x).lower() for c in x))(iter(s))
'10:00:00:00:c9:ab:cd:ef'
答案 4 :(得分:0)
可以使用here中的grouper
食谱来完成。
from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
使用此功能,代码如下:
def join(it):
for el in it:
yield ''.join(el)
':'.join(join(grouper(2, s)))
它的工作原理如下:
grouper(2,s)
会返回元组'1234...' -> ('1','2'), ('3','4') ...
def join(it)
执行此操作:('1','2'), ('3','4') ... -> '12', '34' ...
':'.join(...)
从迭代器创建一个字符串:'12', '34' ... -> '12:34...'
此外,它可能会被重写为:
':'.join(''.join(el) for el in grouper(2, s))
答案 5 :(得分:0)
这是我简单直接的解决方案:
s = '10000000c9abcdef'
new_s = str()
for i in range(0, len(s)-1, 2):
new_s += s[i:i+2]
if i+2 < len(s):
new_s += ':'
>>> new_s
'10:00:00:00:c9:ab:cd:ef'