2010-06-22 78 views
9

Làm cách nào để xóa ký tự khỏi phần tử trong danh sách?Chỉnh sửa các phần tử trong danh sách trong python

Ví dụ:

mylist = ['12:01', '12:02'] 

tôi muốn loại bỏ các thư ruột kết từ các tem thời gian trong một tập tin, vì vậy tôi có thể dễ dàng chuyển đổi chúng sang một thời gian 24h. Ngay bây giờ tôi đang cố gắng lặp lại các phần tử trong danh sách và tìm kiếm phần tử chứa dấu hai chấm và thay thế.

for num in mylist: 
    re.sub(':', '', num) 

Nhưng điều đó dường như không hoạt động.

Trợ giúp!

+3

Nó không hoạt động vì dây là không thay đổi. 're.sub' thực sự ** trả về ** một chuỗi nhưng bạn không gán nó. Đọc tài liệu: http://docs.python.org/library/re.html#re.sub –

Trả lời

13

Giải pháp danh sách hiểu là một Pythonic nhất, nhưng, có một twist quan trọng:

mylist[:] = [s.replace(':', '') for s in mylist] 

Nếu bạn gán cho mylist, các barename, như trong câu trả lời khác, chứ không phải để mylist[:] , "toàn bộ danh sách slice", như tôi khuyên, bạn thực sự đang làm điều gì đó rất khác với "thay thế các mục trong danh sách": bạn đang tạo danh sách mới và chỉ cần rebinding tên thanh mà bạn đã sử dụng trước đó tham khảo danh sách cũ.

Nếu danh sách cũ đó được gọi bằng nhiều tên (bao gồm cả mục nhập trong vùng chứa), việc khôi phục này không ảnh hưởng đến bất kỳ tên nào: ví dụ: nếu bạn có hàm mylist làm đối số chỉ có hiệu lực cục bộ đối với hàm, và không thay đổi những gì người gọi thấy là nội dung của danh sách.

Gán cho lát toàn bộ danh sách, mylist[:] = ..., làm thay đổi đối tượng danh sách hơn mucking xung quanh với các ràng buộc chuyển barenames' - bây giờ danh sách đó là sự thay đổi và không có vấn đề làm thế nào nó được gọi, giá trị mới được những gì đã thấy. Ví dụ, nếu bạn có một hàm nhận mylist làm đối số, thì việc gán phân chia toàn bộ danh sách sẽ làm thay đổi những gì người gọi thấy dưới dạng nội dung của danh sách. Điều quan trọng là biết chính xác bạn đang sử dụng hiệu ứng gì - thông thường bạn sẽ muốn thay đổi đối tượng danh sách, vì vậy, nếu người ta phải đoán, phân bổ toàn bộ danh sách thì thường là cách tốt nhất để đoán ;-). Hiệu năng-khôn ngoan, nó không tạo ra sự khác biệt nào (ngoại trừ việc gán tên mã, nếu nó giữ cả hai đối tượng danh sách cũ và mới xung quanh, sẽ chiếm nhiều bộ nhớ hơn cho bất kỳ khoảng thời gian nào cả hai đối tượng vẫn còn xung quanh).

4
for i, num in enumerate(mylist): 
    mylist[i] = num.replace(':','') 
+1

Theo mặc định, tôi sẽ tìm giải pháp này vì bạn lồng lại các chuỗi mới vào cùng một đối tượng danh sách. Phương pháp đọc danh sách sẽ xóa kết quả khỏi con trỏ danh sách gốc. Khi danh sách là thuộc tính của một đối tượng phức tạp và bạn muốn đối tượng phức tạp đó có danh sách được cập nhật, bạn sẽ phải gán danh sách mới quay trở lại một thuộc tính, nó rất không phải là pythonic. – ddotsenko

15

Sử dụng một list comprehension để tạo ra một danh sách mới:

>>> mylist = ['12:01', '12:02'] 
>>> mylist = [s.replace(':', '') for s in mylist] 
>>> print mylist 
['1201', '1202'] 

Lý do mà giải pháp của bạn không hoạt động là re.sub trả về một mới chuỗi - chuỗi là không thay đổi trong Python, vì vậy re.sub không thể sửa đổi các chuỗi hiện tại của bạn.

+0

Danh sách hiểu để giải cứu! – jathanism

+0

Có lợi thế nào về việc hiểu danh sách theo tiêu chuẩn cho vòng lặp hay chỉ đọc được hoặc độ dài của mã không? – TooAngel

+3

@TooAngel: Nó tuyệt vời hơn;) –

0

Bạn phải chèn trả lại re.sub trở lại trong danh sách. Dưới đây là một danh sách mới. Nhưng bạn cũng có thể làm điều đó cho danh sách của tôi.

mylist = ['12:01', '12:02'] 
tolist = [] 
for num in mylist: 
    a = re.sub(':', '', num) 
    tolist.append(a) 

print tolist 
0

Chuỗi trong python là không thay đổi, có nghĩa là không có chức năng nào có thể thay đổi nội dung của chuỗi hiện có, chỉ cung cấp chuỗi mới. Đây là why.

Xem here để thảo luận về các loại chuỗi có thể thay đổi. Tuy nhiên, trong thực tế, tốt hơn là điều chỉnh tính bất biến của chuỗi.

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