Lọc danh sách các chuỗi dựa trên nội dung


102

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:


170

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 filterhà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.


30
@ S.Lott: tại sao? Có gì sai khi học các chủ đề lập trình nâng cao hữu ích trong một ngữ cảnh phù hợp?
Eli Bendersky

12
@ S.Lott: Tôi nghĩ lambdas đang tạo điều kiện thuận lợi cho việc coi các hàm là các đối tượng hạng nhất, điều này rất quan trọng đối với một số mô hình lập trình. Tôi sẽ không nói rằng chúng rất quan trọng đối với tôi , nhưng tôi tin rằng ngay cả những người mới cũng có thể hưởng lợi từ việc suy nghĩ về lập trình theo cách này, và chắc chắn sẽ không gọi nó là phiền phức .
Eli Bendersky

6
@ S.Lott: nhưng không phải lambdalà người bạn đồng hành hoàn hảo filtertrong 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 abcó 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 intoán tử. Làm thế nào bạn sẽ sử dụng filtermột cách rõ ràng hơn mà không có lambdaở đây?
Eli Bendersky

5
Không chỉ có n00bs mới tìm ra câu trả lời này
Bryan

9
Tôi là một n00b và bây giờ tôi được giới thiệu với lambda. cảm thấy tuyệt vời khi biết điều đó. bây giờ tôi sẽ tìm hiểu thêm về nó.
a_secenthusiast


16
# To support matches from the beginning, not any matches:

items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'

filter(lambda x: x.startswith(prefix), items)

tránh danh sách dưới dạng tên biến vì đây là kiểu đối tượng python.
Rutger Hofste

6

Đã 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ì intoá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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.