2013-08-14 75 views
15

Giả sử tôi có một chuỗi s = 'BINGO'; Tôi muốn lặp qua chuỗi để tạo ra 'B I N G O'.Python thêm khoảng cách giữa các ký tự trong chuỗi. Cách hiệu quả nhất

Đây là những gì tôi đã làm:

result = '' 
for ch in s: 
    result = result + ch + ' ' 
print(result[:-1]) # to rid of space after O 

Có cách nào hiệu quả hơn để đi về điều này?

+3

Trên máy tính của tôi, điều này mất khoảng 500ns. Đó thực sự là một nút cổ chai trong chương trình của bạn? Nếu không, đừng hỏi về hiệu quả; hỏi về sự đơn giản, dễ đọc, v.v. — những thứ thực sự quan trọng. – abarnert

+1

@abarnert có lẽ * hiệu quả * có nghĩa là một cái gì đó đặc biệt đối với bạn, nhưng nó không * thực sự * nhất thiết có nghĩa là * máy * hiệu quả. – kojiro

+0

@kojiro: "hiệu quả" có nghĩa là một cái gì đó đặc biệt trong môn đệ/nghề nghiệp/sở thích/etc. lập trình máy tính, đó là những gì trang web này là về, vì vậy đó là định nghĩa quan trọng. Đó là lý do tại sao trang web này có thẻ hiệu quả được dự định và sử dụng cho đúng mục đích đó. – abarnert

Trả lời

27
s = "BINGO" 
print(" ".join(s)) 

Nên làm điều đó.

+0

từ tài liệu str.join: 'S.join (iterable) -> string' Trả về một chuỗi là sự nối của các chuỗi trong số lặp lại được. ** Dấu phân tách giữa các phần tử là S. ** –

+0

Đúng, chính xác.Python xử lý các chuỗi riêng lẻ dưới dạng một vòng lặp để nó sẽ tham gia từng ký tự (phần tử có thể lặp lại) với một khoảng trắng. –

+0

Làm cách nào để thêm dấu cách vào mỗi ký tự thứ hai? ví dụ, đầu ra sẽ giống như "BI NG O"? –

16
s = "BINGO" 
print(s.replace("", " ")[1: -1]) 

Thời gian bên dưới

$ python -m timeit -s's = "BINGO"' 's.replace(""," ")[1:-1]' 
1000000 loops, best of 3: 0.584 usec per loop 
$ python -m timeit -s's = "BINGO"' '" ".join(s)' 
100000 loops, best of 3: 1.54 usec per loop 
+1

Điều này thật thú vị, bất kỳ ý tưởng nào tại sao phương pháp thay thế nhanh hơn? –

+4

@MikeVella Theo dự đoán, nó có thể phải làm với thực tế là mã nguồn của Python có một [xử lý thay thế trường hợp đặc biệt] (https://github.com/python-git/python/blob/master/Objects/stringobject. C# L2690) để xen kẽ khi chuỗi * từ * là một chuỗi rỗng. – kojiro

+1

Nhân tiện, tôi nghĩ câu trả lời này sẽ tốt hơn nếu nó đưa ra giá trị 'timeit' cho một vài kích cỡ chuỗi khác nhau. – kojiro

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