2011-12-01 41 views
9

Tôi cố gắng để chuyển đổi 10000000C9ABCDEF-10:00:00:00:c9:ab:cd:efChèn một nhân vật đều đặn trong một danh sách

này là cần thiết vì 10000000C9ABCDEF định dạng là cách tôi nhìn thấy HBAs hoặc adapaters bức tượng bán thân chủ khi tôi đăng nhập vào mảng lưu trữ của tôi. Nhưng Thiết bị chuyển mạch SAN hiểu được ký hiệu 10:00:00:00:c9:ab:cd:ef.

Tôi đã chỉ có thể thực hiện được cho đến khi sau:

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

tôi đã cố gắng ':'.join, nhưng điều đó chèn : sau mỗi ký tự, vì vậy tôi có được 1:0:0:0:0:0:0:0:c:9:a:b:c:d:e:f

Tôi muốn .join phải đi qua một vòng lặp nơi tôi có thể nói một cái gì đó như for i in range (0, 15, 2) để nó chèn : sau hai ký tự, nhưng không hoàn toàn chắc chắn làm thế nào để đi về nó. (Tốt mà Python cung cấp cho tôi để lặp trong các bước của 2 hoặc bất kỳ số mà tôi muốn.)

Ngoài ra, tôi sẽ rất biết ơn nếu ai đó có thể trực tiếp tôi để con trỏ nơi tôi có thể kịch bản này tốt hơn ...

Hãy giúp tôi.

Tôi đang sử dụng Python bản 3.2.2 trên Windows 7 (64 Bit)

Trả lời

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' 

Giải thích:

':'.join(...) trả về một chuỗi chèn mới ':' giữa các bộ phận của iterable

s[x:x+2] trả về chuỗi con có độ dài 2 bắt đầu từ x từ s

range(0, len(s) - 1, 2) trả về danh sách số nguyên với một bước của 2

để danh sách hiểu được sẽ chia các chuỗi s trong các chuỗi có chiều dài 2, thì join sẽ đặt chúng lại với nhau nhưng chèn ':' giữa chúng.

+1

Bạn có thể đưa ra lời giải thích về mã không? –

+0

Xin chào F.C., Cảm ơn bạn rất nhiều !! Các bạn rất hữu ích. –

6

Dưới đây là một lựa chọn:

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

Hoặc thậm chí ngắn gọn hơn:

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

Giải pháp regex khá trơn tru !! – jathanism

+0

Xin chào, Yeah giải pháp regex thực sự khá trơn ... cảm ơn bạn sir :) –

0

Nó có thể được thực hiện bằng công thức grouper từ 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) 

Sử dụng chức năng này, các mã sẽ trông giống như:

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

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

Nó hoạt động theo cách này:

grouper(2,s) lợi nhuận tuples '1234...' -> ('1','2'), ('3','4') ...

def join(it) thực hiện điều này: ('1','2'), ('3','4') ... -> '12', '34' ...

':'.join(...) tạo ra một chuỗi từ iterator: '12', '34' ... -> '12:34...'

Ngoài ra, nó có thể được viết lại như sau:

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

+1 cho việc sử dụng công thức cá mú lặp đi lặp lại !! :) – jathanism

+0

-1 Giải pháp được lố bịch một cách lố bịch. –

+0

@JohnMachin Tôi không đồng ý. Hơn nữa, tôi sẽ thêm rằng nó khá đơn giản và dễ hiểu. Nó sử dụng một hàm chuẩn 'grouper' từ module' itertools', và những gì còn lại để làm là tham gia vào các bộ dữ liệu đầu ra bằng ''' .join', và nối các tham số đó bằng' ':'. Join'. Không có lát dễ bị lỗi off-by-one, vv Đơn giản và dễ hiểu! (Tuy nhiên, vấn đề của hương vị tôi nghĩ). – ovgolovin

1

Tôi nghĩ rằng điều gì sẽ giúp bạn bật nhất là một công trình trong python gọi một lát. Tôi tin rằng bạn có thể sử dụng chúng trên bất kỳ đối tượng có thể lặp lại nào, bao gồm cả chuỗi, làm cho chúng khá hữu ích và cái gì đó thường là một ý tưởng rất hay để biết cách sử dụng.

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

Nếu bạn muốn đọc một số chi tiết về lát, họ đang giải thích rất độc đáo in this question, cũng như một phần của thực tế python documentation.

+0

Điều này thật tuyệt .... Các bạn thật tuyệt vời .... Tôi nghĩ khá sớm tôi sẽ tự hỏi giải pháp nào là tốt nhất vì có nhiều cách để giải quyết mọi thứ trong Python. Thats tuyệt vời .... có thể là thời gian sẽ cho tôi biết đó là một phương pháp tốt hơn để sử dụng cho một vấn đề nhất định .... –

+0

Thật buồn cười khi bạn đề cập đến ... Một trong những nguyên tắc hướng dẫn của Python là "Phải có một- - và tốt nhất là chỉ có một - cách rõ ràng để làm điều đó. " Đó là một phần của những gì được gọi là Zen của Python, bạn có thể đọc nó nếu bạn sử dụng 'import this' trong Python Interpreter. Ngoài ra, bạn có thể đọc nó [ở đây.] (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' 

Ở dạng 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, rất nhiều tùy chọn !! Cảm ơn bạn Austin :) –

Các vấn đề liên quan