插入定期角色列表中的
我想转换10000000C9ABCDEF
到10:00:00:00:c9:ab:cd:ef
插入定期角色列表中的
这是必要的,因为10000000C9ABCDEF
格式是怎么看的HBA或主机总线adapaters当我登录到我的存储阵列。但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
>>> 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]
返回从x开始的长度为2的子字符串s从
range(0, len(s) - 1, 2)
返回整数列表步长为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'
正则表达式的解决方案非常光滑! – jathanism
嗨,呀,正则表达式的解决方案确实是非常漂亮...谢谢主席先生:) –
它可以使用grouper
配方从here来完成。
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))
我想你会帮你出的最多的是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'
如果你想阅读一些更多的切片,他们解释非常漂亮in this question,以及实际python documentation.
这真是棒极了....你们真棒....我想很快我会想知道哪种解决方案最好,因为有不止一种方法可以解决Python中的问题。这真棒....可能是时间会告诉我哪个是一个更好的方法来使用一个给定的问题... –
有趣的是,你提到... Python的指导原则之一是,“应该有一个 - - 最好只有一个 - 明显的方式来做到这一点。“它是Python的Zen的一部分,如果你在Python解释器中使用'import this',你可以阅读它。或者,你可以阅读它[这里。](http://www.python.org/dev/peps/pep-0020/) –
>>> s='10000000C9ABCDEF'
>>> si=iter(s)
>>> ':'.join(c.lower()+next(si).lower() for c in si)
>>> '10:00:00:00:c9:ab:cd:ef'
的一部分。在拉姆达形式:
>>> (lambda x: ':'.join(c.lower()+next(x).lower() for c in x))(iter(s))
'10:00:00:00:c9:ab:cd:ef'
哇,这么多的选择!谢谢奥斯汀:) –
您能否介绍一下代码的解释? –
嗨F.C.,非常感谢!你们是非常有帮助的。 –