Đây là cách Pythonic để làm điều đó:
data = [['a','b'], ['a','c'], ['b','d']]
search = 'c'
any(e[1] == search for e in data)
Hoặc ... tốt, tôi sẽ không yêu cầu bồi thường này là "một trong những cách Pythonic true" để làm điều đó bởi vì tại một số điểm nó trở nên một chút chủ quan Pythonic là gì và những gì không phải là, hoặc phương pháp nào là Pythonic hơn một loại khác. Nhưng sử dụng any()
chắc chắn là kiểu điển hình của Python hơn vòng lặp for
như trong ví dụ: RichieHindle's answer,
Tất nhiên có một vòng lặp ẩn trong việc triển khai any
, mặc dù nó thoát ra khỏi vòng lặp ngay sau khi tìm thấy kết quả phù hợp.
Vì tôi đã chán Tôi đã thực hiện một kịch bản thời gian để so sánh hiệu suất của các đề xuất khác nhau, sửa đổi một số trong số chúng khi cần thiết để làm cho API giống nhau.Bây giờ, chúng ta nên nhớ rằng nhanh nhất không phải luôn luôn tốt nhất, và được nhanh chóng chắc chắn không phải là điều tương tự như là Pythonic. Điều đó đang được nói, kết quả là ... lạ. Rõ ràng là các vòngrất nhanh, đó không phải là những gì tôi mong đợi, vì vậy tôi lấy những hạt này bằng một hạt muối mà không hiểu tại sao chúng lại xuất hiện theo cách của chúng.
Dù sao, khi tôi sử dụng danh sách được xác định trong câu hỏi với ba danh sách con của hai yếu tố từng, từ nhanh nhất để chậm nhất tôi nhận được những kết quả này:
- RichieHindle's answer với
for
vòng lặp, ghi nhận trong 0.22 ms
- Terence Honles' first suggestion mà tạo ra một danh sách, tại 0,36 ms
- Pierre-Luc Bedard's answer (last code block), tại 0,43 ms
- về cơ bản gắn giữa Markus's answer và
for
vòng từ the original question, tại 0,48 ms
- Coady's answer sử dụng
operator.itemgetter()
, tại 0,53 ms
- đủ Đóng để tính là một tie giữa Alex Martelli's answer với
ifilter()
và Anon's answer, tại 0,67 ms (Alex luôn là khoảng nửa micro giây nhanh hơn)
- gần Một tie -enough giữa jojo's answer, mỏ, Brandon E Taylor's (mà giống hệt mỏ), và Terence Honles' second suggestion sử dụng
any()
, tất cả sắp tới trong lúc 0,81-0,82 ms
- và sau đó user27221's answer sử dụng comprehensions danh sách lồng nhau, tại 0,95 ms
Rõ ràng thời gian thực không có ý nghĩa đối với phần cứng của người khác, nhưng sự khác biệt giữa chúng nên đưa ra một số ý tưởng về các phương pháp khác nhau.
Khi tôi sử dụng danh sách dài hơn, mọi thứ sẽ thay đổi một chút. Tôi bắt đầu với danh sách trong câu hỏi, với ba danh sách con, và nối thêm 197 danh sách con khác, với tổng số 200 danh sách con mỗi chiều dài hai. Sử dụng danh sách dài này, đây là kết quả:
- RichieHindle's answer, đồng 0.22 ms như với danh sách ngắn
- Coady's answer sử dụng
operator.itemgetter()
, một lần nữa tại 0,53 ms
- Terence Honles' first suggestion mà tạo ra một danh sách, tại 0,36 ms
- một tie ảo giữa Alex Martelli's answer với
ifilter()
và Anon's answer, tại 0,67 ms
- một lần nữa một tie cận đủ giữa câu trả lời của tôi, Brandon E Taylor's phương pháp giống hệt nhau, và Terence Honles' second suggestion sử dụng
any()
, tất cả sắp tới trong lúc 0,81-0,82 ms
Đó là những người mà giữ thời gian ban đầu của họ khi danh sách được mở rộng. Phần còn lại, mà không, là
- các
for
vòng từ the original question, tại 1,24 ms
- Terence Honles' first suggestion mà tạo ra một danh sách, tại 7.49 ms
- Pierre-Luc Bedard's answer (last code block), lúc 8 .12 ms
- Markus's answer, tại 10,27 ms
- jojo's answer, tại 19,87 ms
- Và cuối cùng user27221's answer sử dụng comprehensions danh sách lồng nhau, tại 60,59 ms
Tại thời điểm này trong "sự nghiệp" trăn của tôi, tôi ưu tiên phương pháp này vì nó rất dễ đọc. Tôi có thể trở lại để thử những người khác cho hiệu suất, mặc dù. Danh sách của tôi nhận được khá lớn tại một thời điểm. Có nơi nào tôi có thể so sánh hiệu suất của các cách tiếp cận khác nhau không? – greye
Sử dụng mô-đun 'timeit' để kiểm tra hiệu suất của loại điều sau: http://docs.python.org/library/timeit.html – RichieHindle
Điều gì xảy ra nếu chúng ta không biết liệu ký tự mà chúng ta đang tìm kiếm có trong vị trí thứ [0], [1] st, [2] ... trong danh sách lồng nhau? ví dụ. chúng tôi đang tìm kiếm 'b', bằng cách sử dụng phương pháp này, nó sẽ chỉ trả lại ['a', 'b'] thay vì ['b', 'd']. –