2010-10-03 20 views
8

Tôi đã cố gắng để viết một câu trả lời cho điều này question và đã khá ngạc nhiên khi tìm ra rằng không có phương pháp tìm kiếm cho danh sách, danh sách chỉ có phương pháp chỉ mục (chuỗi có tìm và chỉ mục).Python: Tại sao Danh sách không có phương thức tìm kiếm?

Có ai cho tôi biết lý do đằng sau điều đó không? Tại sao dây có cả hai?

+0

Câu hỏi này là về danh sách tương đương với điều này: '" 112131 ".find (" 1213 ") => 1' tức là' [1,1,2,1,3,1] .find ([1,2 , 1,3]) => 1' - Nếu bạn muốn làm điều này * trong thời gian tuyến tính * bạn cần phải thực hiện một trong các thuật toán phù hợp với chuỗi chính mình, mà không phải là dễ dàng. –

Trả lời

7

Tôi không biết tại sao hoặc có thể được chôn trong một số PEP ở đâu đó, nhưng tôi biết 2 phương pháp "tìm" rất cơ bản cho danh sách và họ là array.index() và toán tử in. Bạn luôn có thể sử dụng 2 mục này để tìm các mục của bạn. (Ngoài ra, mô-đun, vv)

+2

Phương thức 'index' và toán tử' in' có thể tìm kiếm các mục đơn trong danh sách (Ai đó hãy cho tôi biết nếu tôi có thể gọi chúng là nguyên tử). OP muốn biết liệu anh ta có thể tìm thấy một danh sách là một danh sách phụ của một danh sách khác với các mục xuất hiện theo cùng một thứ tự hay không. – dheerosaur

+0

Nhưng nguyên tắc cơ bản đằng sau cũng lặp lại thông qua danh sách, cho dù lồng nhau của nó hay không, và tìm kiếm chúng với các toán tử này. OP cũng được tự do phát triển các phương pháp/lớp/máy phát điện riêng ... cho điều đó. – ghostdog74

+0

Phương thức 'find' chuẩn cho mảng là tìm kiếm một mục duy nhất. Không ai ngạc nhiên khi biết rằng việc triển khai mảng không thực hiện tìm kiếm chuỗi con. –

2

Phương thức "tìm" cho danh sách là index.

tôi làm xem xét các mâu thuẫn giữa string.findlist.index là không may, cả hai tên và hành vi: string.find lợi nhuận -1 khi không phù hợp được tìm thấy, nơi list.index tăng ValueError. Điều này có thể đã được thiết kế nhất quán hơn. Sự khác biệt không thể hòa giải duy nhất giữa các hoạt động này là string.find tìm kiếm một chuỗi các mục, trong đó list.index tìm kiếm chính xác một mục (trong đó, một mình, không biện minh bằng cách sử dụng các tên khác nhau).

+2

thử '" asdfasdf ".index ('z')' lần sau trong REPL của bạn. – aaronasterling

+0

@AaronMcSmooth: Nó làm nổi bật sự ngớ ngẩn của "một cách rõ ràng để làm điều gì đó", khi họ thậm chí không thể giữ nó cho các phương pháp chuỗi lõi. –

+2

nhưng điểm của ví dụ của tôi là họ _do_ giữ nó. 'list' và' string' đều có phương thức 'index' hoạt động giống hệt nhau. nó chỉ là 'chuỗi' thêm một phương thức' find' ở trên đó. Tôi không chắc chắn lý do tại sao họ không làm điều đó cho 'danh sách' là tốt nhưng không có sự tương đương giữa' list.index' và 'string.find'. – aaronasterling

3

Tôi nghĩ lý do không có phương pháp 'tìm' và 'chỉ mục' riêng biệt là chúng không đủ khác nhau. Cả hai sẽ trả về cùng một điều trong trường hợp mục tìm kiếm tồn tại trong danh sách (điều này đúng với hai phương thức chuỗi); chúng khác nhau trong trường hợp mục tìm kiếm không có trong danh sách/chuỗi; tuy nhiên bạn có thể xây dựng một trong hai cách tìm kiếm hoặc chỉ mục từ cái kia. Nếu bạn đến từ các ngôn ngữ khác, có vẻ như cách cư xử tồi tệ để nâng cao và bắt ngoại lệ cho một điều kiện không phải lỗi mà bạn có thể dễ dàng kiểm tra, nhưng trong Python, nó thường được coi là pythonic hơn để quay đầu tiên và đặt câu hỏi sau, er , để sử dụng xử lý ngoại lệ thay vì các thử nghiệm như thế này (ví dụ: Better to 'try' something and catch the exception or test if its possible first to avoid an exception?).

Tôi không nghĩ đó là một ý tưởng tốt để xây dựng 'tìm' ra khỏi 'index' và 'trong', như

if foo in my_list: 
    foo_index = my_list.index(foo) 
else: 
    foo_index = -1 # or do whatever else you want 

vì cả trong và chỉ số sẽ đòi hỏi một O (n) vượt qua danh sách.

Tốt hơn để xây dựng 'tìm' ra khỏi 'index' và try/catch, như:

try: 
    foo_index = my_list.index(foo) 
catch ValueError: 
    foo_index = -1 # or do whatever else you want 

Bây giờ, là tại sao danh sách được xây dựng theo cách này (với chỉ số duy nhất), và chuỗi đã được xây dựng cách khác (với chỉ mục riêng biệt và tìm thấy) ... Tôi không thể nói.

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