2010-07-12 69 views
27

Tôi có danh sách các đối tượng được nối từ cơ sở dữ liệu mysql và chứa dấu cách. Tôi muốn loại bỏ các không gian như dưới đây, nhưng mã im bằng cách sử dụng doesnt làm việc?Python: Xóa dấu cách khỏi đối tượng danh sách

hello = ['999 ',' 666 '] 

k = [] 

for i in hello: 
    str(i).replace(' ','') 
    k.append(i) 

print k 
+2

Hoặc sửa chữa các loại lĩnh vực cơ sở dữ liệu ;-) – ChristopheD

+0

@ChristopheD: cơ sở dữ liệu gì "lĩnh vực" Lực lượng loại ** hàng đầu ** không gian? Tốt hơn để sửa nhà phát triển và người thử nghiệm. –

+1

@Johan Machin: Tôi đã làm sai không gian hàng đầu trên mục nhập thứ hai (được đánh giá là quá nhanh, oops) – ChristopheD

Trả lời

63

Strings bằng Python là không thay đổi (nghĩa là dữ liệu của họ không thể được sửa đổi) để thay thế phương pháp không sửa đổi các chuỗi - nó trả về một chuỗi mới. Bạn có thể sửa mã của mình như sau:

for i in hello: 
    j = i.replace(' ','') 
    k.append(j) 

Tuy nhiên, cách tốt hơn để đạt được mục đích của bạn là sử dụng danh sách hiểu. Ví dụ: mã sau xóa các khoảng trắng đầu và cuối khỏi mọi chuỗi trong danh sách bằng cách sử dụng các số strip:

hello = [x.strip(' ') for x in hello] 
+7

+1 cho dải. -1 cho thay thế ('', '') –

+1

OP muốn xóa * tất cả * dấu cách, không chỉ đoạn giới thiệu, vậy tại sao -1 cho 'thay thế ',' ')'? Không có phương thức 'dải' nào, ít hơn nhiều [phương pháp phân đoạn dựng sẵn] khác (http://docs.python.org/library/stdtypes.html#string-methods), thực hiện công việc (bỏ qua Rube Goldbergs như ' '' .join (s.split()) '). –

+0

Ah, vì vậy nó không phải là một lĩnh vực văn bản sử dụng không gian để tách hàng ngàn, hàng triệu, vv được định nghĩa là văn bản bởi vì nó có thể chứa các từ khoá không thường xuyên? OK, tôi đã bỏ lỡ điều đó. –

5

result = bản đồ (lambda x: x.strip(), xin chào)

+3

Không cần sử dụng 'lambda'; thay vào đó bạn có thể sử dụng: 'result = map (str.strip(), hello)'. Tuy nhiên, Như đã đề cập bởi @riza, trong bản đồ Python 3 trả về một trình lặp thay vì một danh sách. Vì vậy, thực hành tốt nhất sẽ là 'result = list (map (str.strip(), hello))'. – amicitas

+1

Lưu ý rằng (trong Python 3 ít nhất) bạn phải nói 'map (str.strip, mylist)' không 'map (str.strip(), mylist)'. – William

2

.

k = [x.replace(' ', '') for x in hello] 
0

thay thế() không hoạt động tại chỗ, bạn cần phải gán kết quả của nó cho thứ gì đó. Ngoài ra, đối với một cú pháp ngắn gọn hơn, bạn có thể thay thế cho vòng lặp với một lớp lót: hello_no_spaces = map(lambda x: x.replace(' ', ''), hello)

1

Giả sử bạn không muốn loại bỏ không gian nội bộ:

def normalize_space(s): 
    """Return s stripped of leading/trailing whitespace 
    and with internal runs of whitespace replaced by a single SPACE""" 
    # This should be a str method :-(
    return ' '.join(s.split()) 

replacement = [normalize_space(i) for i in hello] 
6

Danh sách hiểu [num.strip() for num in hello] là nhanh nhất .

>>> import timeit 
>>> hello = ['999 ',' 666 '] 

>>> t1 = lambda: map(str.strip, hello) 
>>> timeit.timeit(t1) 
1.825870468015296 

>>> t2 = lambda: list(map(str.strip, hello)) 
>>> timeit.timeit(t2) 
2.2825958750515269 

>>> t3 = lambda: [num.strip() for num in hello] 
>>> timeit.timeit(t3) 
1.4320335103944899 

>>> t4 = lambda: [num.replace(' ', '') for num in hello] 
>>> timeit.timeit(t4) 
1.7670568718943969 
+0

'list (map (str.strip, hello))' không tạo ra nhiều ý nghĩa vì 'map' trả về một danh sách. – ChristopheD

+1

@ChristopheD: Trong Python 3, bản đồ không trả về một danh sách. – riza

0
for element in range(0,len(hello)): 
     d[element] = hello[element].strip() 
+2

Ngoài mã của bạn, vui lòng giải thích tại sao câu trả lời của bạn hoạt động và cách giải quyết vấn đề. – buczek

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