2012-03-28 34 views
26

Làm cách nào để bỏ qua thông báo lỗi "không có trong danh sách" nếu tôi gọi a.remove(x) khi x không có trong danh sách a?Làm cách nào để bỏ qua ValueError khi tôi cố xóa một phần tử khỏi danh sách?

Đây là tình hình của tôi:

>>> a = range(10) 
>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> a.remove(10) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: list.remove(x): x not in list 
>>> a.remove(9) 

Trả lời

24

Một cách tốt và thread-safe để làm điều này là chỉ cần thử nó và bỏ qua những ngoại lệ:

try: 
    a.remove(10) 
except ValueError: 
    pass # do nothing! 
17

Cá nhân tôi muốn xem xét sử dụng một set thay vì list miễn là thứ tự của các yếu tố của bạn không nhất thiết phải quan trọng. Sau đó, bạn có thể sử dụng phương pháp loại bỏ:

>>> S = set(range(10)) 
>>> S 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> S.remove(10) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 10 
>>> S.discard(10) 
>>> S 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
+0

Sử dụng một ' set' khi không thích hợp có thể có hậu quả không mong muốn. Từ tài liệu, ['Xóa mục đầu tiên khỏi danh sách có giá trị là x. Đó là lỗi nếu không có mục nào như vậy.'] (http://docs.python.org/2/tutorial/datastructures.html) OP có thể chỉ muốn xóa mục đầu tiên trong các trường hợp sử dụng khác, cho biết các bản sao hợp lệ bên trong danh sách. – haventchecked

6

Là một thay thế để bỏ qua ValueError

try: 
    a.remove(10) 
except ValueError: 
    pass # do nothing! 

Tôi nghĩ rằng đây là một chút đơn giản hơn và dễ đọc:

if 10 in a: 
    a.remove(10) 
+4

Đó là một suy nghĩ tốt, nhưng như @Niklas B. chỉ ra, ông là "thread-an toàn", bởi vì không có vấn đề gì, 10 không được ở đó chỉ có thể gây ra một * bị bắt * ngoại lệ. Trong khi trong câu trả lời này, '10' có thể được loại bỏ từ' a' giữa điều kiện 'if' đang được kiểm tra và' .remove() 'được gọi, dẫn đến một * uncaught *' ValueError'. (Nếu bạn có thể đảm bảo về 'a' không bị sửa đổi bởi bất cứ điều gì khác, thì điều này là tốt, nhưng với câu trả lời được chấp nhận, bạn thậm chí không phải nghĩ về khả năng đó.) – tscizzle

+0

hữu ích để có một lớp lót cho cùng một mục đích, và trong trường hợp đó 'a in 10 và a.remove (10)' thực hiện công việc. Tuy nhiên, nó cũng không an toàn. – fuglede

+2

Kinda rách trên này ... tại thời điểm nào bạn từ bỏ [zen của python] (https://www.python.org/dev/peps/pep-0020/) cho an toàn thread? Chắc chắn nếu bạn đang viết một mô-đun thư viện có khả năng được sử dụng trong một ứng dụng đa luồng, bạn sẽ cần phải làm cho mọi thứ phức tạp hơn và/hoặc tài liệu an toàn chủ đề của nó (hoặc thiếu nó), nhưng một trong những cố gắng để làm điều đó nói chung? – reteptilian

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