2011-12-01 52 views
9

我想转换10000000C9ABCDEF10: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

回答

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会将它们放回到一起,但在它们之间插入':'。

+1

您能否介绍一下代码的解释? –

+0

嗨F.C.,非常感谢!你们是非常有帮助的。 –

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' 
+0

正则表达式的解决方案非常光滑! – jathanism

+0

嗨,呀,正则表达式的解决方案确实是非常漂亮...谢谢主席先生:) –

0

它可以使用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)) 
+0

+1使用itertools石斑鱼食谱! :) – jathanism

+0

-1解决方案是可笑的复杂。 –

+0

@JohnMachin我不同意。此外,我想补充一点,它非常简单直接。它使用从模块'itertools'的标准功能'grouper',什么仍剩下要做的是'“加入到输出元组” .join',并通过'加盟者加盟的元组“:” join'。没有切片容易发生逐个错误等。简单而直接! (仍然,我认为这是品味的问题)。 – ovgolovin

1

我想你会帮你出的最多的是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.

+0

这真是棒极了....你们真棒....我想很快我会想知道哪种解决方案最好,因为有不止一种方法可以解决Python中的问题。这真棒....可能是时间会告诉我哪个是一个更好的方法来使用一个给定的问题... –

+0

有趣的是,你提到... Python的指导原则之一是,“应该有一个 - - 最好只有一个 - 明显的方式来做到这一点。“它是Python的Zen的一部分,如果你在Python解释器中使用'import this',你可以阅读它。或者,你可以阅读它[这里。](http://www.python.org/dev/peps/pep-0020/) –

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 x: ':'.join(c.lower()+next(x).lower() for c in x))(iter(s)) 
'10:00:00:00:c9:ab:cd:ef' 
+0

哇,这么多的选择!谢谢奥斯汀:) –