2011-12-01 44 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

哇,這麼多的選擇!謝謝奧斯汀:) –