Với danh sách ['a','ab','abc','bac']
, tôi muốn tính toán một danh sách với các chuỗi có 'ab'
trong đó. Tức là kết quả là ['ab','abc']
. Làm thế nào điều này có thể được thực hiện trong Python?
Câu trả lời:
Việc lọc đơn giản này có thể đạt được theo nhiều cách với Python. Cách tốt nhất là sử dụng "danh sách hiểu" như sau:
>>> lst = ['a', 'ab', 'abc', 'bac']
>>> [k for k in lst if 'ab' in k]
['ab', 'abc']
Một cách khác là sử dụng filter
hàm. Trong Python 2:
>>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']
Trong Python 3, nó trả về một trình lặp thay vì một danh sách, nhưng bạn có thể ép kiểu nó:
>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']
Mặc dù thực hành tốt hơn là sử dụng khả năng hiểu.
lambda
là người bạn đồng hành hoàn hảo filter
trong trường hợp này sao? Tôi nghĩ rằng việc viết một hàm riêng chỉ để kiểm tra xem ab
có trong danh sách đã cho hay không là một việc làm quá mức cần thiết. Vì vậy, viết một hàm tổng quát hơn về cơ bản bao hàm in
toán tử. Làm thế nào bạn sẽ sử dụng filter
một cách rõ ràng hơn mà không có lambda
ở đây?
[x for x in L if 'ab' in x]
# To support matches from the beginning, not any matches:
items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'
filter(lambda x: x.startswith(prefix), items)
Đã thử điều này một cách nhanh chóng trong shell tương tác:
>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>
Tại sao điều này hoạt động? Bởi vì in
toán tử được định nghĩa cho chuỗi có nghĩa là: "là chuỗi con của".
Ngoài ra, bạn có thể muốn xem xét việc viết ra vòng lặp thay vì sử dụng cú pháp hiểu danh sách được sử dụng ở trên:
l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
if 'ab' in s:
result.append(s)
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist