2011-12-01 16 views
9

Próbuję przekonwertować 10000000C9ABCDEF do 10:00:00:00:c9:ab:cd:efWstawianie znaku w regularnych odstępach czasu w liście

Jest to konieczne, ponieważ Format 10000000C9ABCDEF jest jak widzę HBA lub host adapaters biust kiedy zalogować się do moich macierzy dyskowych. Ale przełączniki SAN rozumieją notację 10:00:00:00:c9:ab:cd:ef.

mam tylko udało się osiągnąć aż następujące:

#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() 

Próbowałem ':'.join, ale wstawia : po każdym znaku, więc mogę 1:0:0:0:0:0:0:0:c:9:a:b:c:d:e:f

chcę .join przejść przez Pętla, w której mogę powiedzieć coś w rodzaju for i in range (0, 15, 2), aby wstawić : po dwóch znakach, ale nie do końca wiem, jak to zrobić. (Dobrze, że Python oferuje mi do pętli w krokach 2 lub dowolnej liczbie, że chcę.)

Dodatkowo, będę wdzięczny, jeśli ktoś może skierować mnie do wskazówek gdzie mogłem skrypt ten lepszy ...

Proszę pomóż.

Używam Pythona Version 3.2.2 na Windows 7 (64 bit)

Odpowiedz

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' 

Objaśnienie:

':'.join(...) zwraca nowy wstawianie ciąg ':' między częściach iterable

s[x:x+2] zwraca podciąg o długości 2 rozpoczynający się od x od s

zwraca listę liczb całkowitych z krokiem 2

, więc zrozumienie listy spowodowałoby rozszczepienie ciągu s w ciągach o długości 2, następnie join umieściłoby je z powrotem, ale wstawiając ":" między nimi.

+1

Czy możesz dołączyć objaśnienie kodu? –

+0

Hi F.C., Dziękuję bardzo !! Jesteście bardzo pomocni. –

6

Oto kolejna opcja:

>>> s = '10000000c9abcdef' 
>>> ':'.join(a + b for a, b in zip(*[iter(s)]*2)) 
'10:00:00:00:c9:ab:cd:ef' 

Albo nawet bardziej zwięzły:

>>> import re 
>>> ':'.join(re.findall('..', s)) 
'10:00:00:00:c9:ab:cd:ef' 
+0

Rozwiązanie regex jest dość śliskie !! – jathanism

+0

Cześć, Tak, rozwiązanie do regex jest naprawdę ładne ... dziękuję, proszę pana :) –

0

To może być wykonane przy użyciu grouper przepis od 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) 

Używając tej funkcji, kod będzie wyglądać następująco:

def join(it): 
    for el in it: 
     yield ''.join(el) 

':'.join(join(grouper(2, s))) 

To działa w ten sposób:

grouper(2,s) zwraca krotki '1234...' -> ('1','2'), ('3','4') ...

def join(it) robi to: ('1','2'), ('3','4') ... -> '12', '34' ...

':'.join(...) tworzy ciąg z iteracyjnej: '12', '34' ... -> '12:34...'

Również może to być zapisane jako:

':'.join(''.join(el) for el in grouper(2, s)) 
+0

+1 za użycie przepisu groutpera itertools !! :) – jathanism

+0

-1 Rozwiązanie jest śmiesznie zawiłe. –

+0

@JohnMachin Nie zgadzam się. Ponadto chciałbym dodać, że jest to dość proste i bezpośrednie. Używa on standardowej funkcji 'grouper' z modułu' itertools', a pozostaje jeszcze do zrobienia, aby dołączyć krotki wyjściowe przez ''' .join' i połączyć te połączone krotki przez' ':'. Join'. Nie ma plasterków podatnych na błędy typu "jeden po drugim", itp. Proste i proste! (Wciąż myślę o smaku). – ovgolovin

1

myślę co by pomóc najbardziej jest konstrukcją w python zwany plaster. Sądzę, że można ich używać na dowolnym iterowanym obiekcie, w tym na łańcuchach, co czyni je całkiem użytecznymi i coś, co jest ogólnie dobrym pomysłem, aby wiedzieć, jak używać.

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

Jeśli chcesz przeczytać coś więcej o plastry, są one wyjaśnione bardzo ładnie in this question, jak również części rzeczywistej python documentation.

+0

To jest świetne ... Jesteście świetni ... Myślę, że wkrótce będę się zastanawiał, które rozwiązanie będzie najlepsze, ponieważ istnieje więcej niż jeden sposób rozwiązywania problemów w Pythonie. To niesamowite ... może być czas pokaże mi, która jest lepsza metoda użycia dla danego problemu .... –

+0

To zabawne, że wspomniałeś o tym ... Jedną z zasad przewodnich Pythona jest to, że "Powinno być jedno - - a najlepiej tylko jeden - czysty sposób na zrobienie tego. " Jest częścią tego, co nazywa się Zen Python, możesz go przeczytać, jeśli użyjesz 'import this' w Python Interpreter. Możesz też przeczytać [tutaj.] (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' 

w formie lambda:

>>> (lambda x: ':'.join(c.lower()+next(x).lower() for c in x))(iter(s)) 
'10:00:00:00:c9:ab:cd:ef' 
+0

Wow, tak wiele opcji !! Dziękuję Austin :) –

Powiązane problemy