1) Phong cách gần như tiếng Anh:
Kiểm tra sự hiện diện bằng cách sử dụng in
toán tử, sau đó áp dụng remove
phương pháp.
if thing in some_list: some_list.remove(thing)
Các remove
phương pháp sẽ loại bỏ chỉ sự xuất hiện đầu tiên của thing
, để loại bỏ tất cả các lần xuất hiện, bạn có thể sử dụng while
thay vì if
.
while thing in some_list: some_list.remove(thing)
- Đủ đơn giản, có lẽ là sự lựa chọn của tôi. Cho các danh sách nhỏ (không thể cưỡng lại một lớp)
2) Kiểu vịt , kiểu EAFP :
Thái độ bắn-trước-hỏi-hỏi-cuối cùng này là phổ biến trong Python. Thay vì kiểm tra trước nếu đối tượng phù hợp, chỉ cần thực hiện thao tác và bắt Ngoại lệ có liên quan:
try:
some_list.remove(thing)
except ValueError:
pass # or scream: thing not in some_list!
except AttributeError:
call_security("some_list not quacking like a list!")
Dĩ nhiên, mệnh đề ngoại trừ thứ hai trong ví dụ trên không chỉ là sự hài hước đáng nghi ngờ mà còn hoàn toàn không cần thiết (vấn đề là minh họa cách gõ vịt cho những người không quen với khái niệm này).
Nếu bạn mong đợi nhiều lần xuất hiện:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- một chút dài dòng cho trường hợp sử dụng cụ thể này, nhưng rất thành ngữ trong Python.
- điều này thực hiện tốt hơn # 1
- PEP 463 đã đề xuất một cú pháp ngắn hơn để thử / ngoại trừ việc sử dụng đơn giản sẽ có ích ở đây, nhưng nó không được chấp thuận.
Tuy nhiên, với trình quản lý bối cảnh () được giới thiệu trong python 3.4), đoạn mã trên có thể được đơn giản hóa để:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
Một lần nữa, nếu bạn mong đợi nhiều lần xuất hiện:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) Phong cách chức năng:
Khoảng năm 1993, Python có lambda
, reduce()
, filter()
và map()
, lịch sự của một Lisp hacker người nhớ họ và các bản vá lỗi làm việc gửi *. Bạn có thể dùngfilter
để xóa các thành phần khỏi danh sách:
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
Có một lối tắt có thể hữu ích cho trường hợp của bạn: nếu bạn muốn lọc ra các mục trống (thực tế là các mục trong đó bool(item) == False
, như None
, số không, chuỗi rỗng hoặc các bộ sưu tập trống khác), bạn có thể chuyển Không làm đối số đầu tiên:
cleaned_list = filter(None, some_list)
- [update] : trong Python 2.x,
filter(function, iterable)
được sử dụng tương đương với [item for item in iterable if function(item)]
(hoặc [item for item in iterable if item]
nếu đối số đầu tiên là None
); trong Python 3.x, bây giờ nó tương đương với (item for item in iterable if function(item))
. Sự khác biệt tinh tế là bộ lọc được sử dụng để trả về một danh sách, bây giờ nó hoạt động giống như một biểu thức trình tạo - điều này ổn nếu bạn chỉ lặp lại danh sách đã xóa và loại bỏ nó, nhưng nếu bạn thực sự cần một danh sách, bạn phải kèm theofilter()
cuộc gọi với các nhà list()
xây dựng.
- * Những cấu trúc có hương vị Lispy này được coi là một người ngoài hành tinh nhỏ trong Python. Khoảng năm 2005, Guido thậm chí đã nói về việc bỏ
filter
- cùng với những người bạn đồng hành map
và reduce
(họ chưa đi nhưng reduce
đã được chuyển sang mô-đun funcools , đáng để xem nếu bạn thích các chức năng bậc cao ).
4) Phong cách toán học:
Việc hiểu danh sách trở thành kiểu ưa thích cho thao tác danh sách trong Python kể từ khi được giới thiệu trong phiên bản 2.0 bởi PEP 202 . Lý do đằng sau nó là việc hiểu danh sách cung cấp một cách ngắn gọn hơn để tạo danh sách trong các tình huống map()
và filter()
và / hoặc các vòng lặp lồng nhau hiện sẽ được sử dụng.
cleaned_list = [ x for x in some_list if x is not thing ]
Các biểu thức của trình tạo đã được giới thiệu trong phiên bản 2.4 bởi PEP 289 . Biểu thức trình tạo sẽ tốt hơn cho các tình huống mà bạn không thực sự cần (hoặc muốn) có một danh sách đầy đủ được tạo trong bộ nhớ - như khi bạn chỉ muốn lặp lại từng phần tử một. Nếu bạn chỉ lặp đi lặp lại trong danh sách, bạn có thể nghĩ về biểu thức trình tạo như một sự hiểu biết danh sách được đánh giá lười biếng :
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
Ghi chú
- bạn có thể muốn sử dụng toán tử bất đẳng thức
!=
thay vì is not
( sự khác biệt là quan trọng )
- đối với các nhà phê bình về các phương pháp ngụ ý một bản sao danh sách: trái với niềm tin phổ biến, các biểu thức của trình tạo không phải lúc nào cũng hiệu quả hơn so với việc hiểu danh sách - vui lòng lập hồ sơ trước khi phàn nàn