2010-12-17 38 views
8

Tôi có một danh sách các bộ dữ liệu có dạng (string, int). Tôi đang cố gắng tìm kiếm trong danh sách và trả lại bộ tuple có thành phần chuỗi khớp với tham số, như sau: let find_tuple string_name tuples_list =Ghép một mục trong Danh sách bộ sưu tập

Làm cách nào để thực hiện việc này? Tôi không thể quấn quanh đầu tôi được. Có cách nào để sử dụng cú pháp phù hợp như (string, _) ->... không?

Trả lời

7

Bạn có thể đạt được điều này như sau

let rec find_tuple string_name tuples_list = 
     match tuples_list with 
      [] -> raise Not_found 
      |(s, i)::tl -> if s = string_name then (s, i) 
            else find_tuple string_name tl 

hoặc đơn giản là

List.find (fun s -> fst s = string_name) tuples_list 
+0

Bạn có thể sử dụng từ khóa 'as' để đơn giản hóa mọi thứ một chút:' | ((s, i) là h) :: tl -> nếu ... thì h else ... 'Ngoài ra, không biết về hàm' fst', cảm ơn vì đã chỉ ra nó! –

+1

Tùy chọn thứ hai cũng có thể được viết dưới dạng 'List.find (fun (string, _) -> string = string_name) tuples_list', có' (string, _) 'mà OP muốn. – sepp2k

+0

Cảm ơn! Với một 'let rec' nó hoạt động hoàn hảo. – yavoh

1

Vâng, bạn sử dụng phù hợp với cú pháp như thế, nhưng sẽ cần phải bảo vệ trận đấu (hoặc bạn có thể sử dụng nếu sau đó khác) . Mô-đun List có chức năng gọi là find sẽ trả về phần tử đầu tiên khớp với vị từ. Nó cũng có chức năng filter (và find_all - cùng chức năng) trả về danh sách tất cả các phần tử khớp với vị từ. Ví dụ:

let predicate string_name tuple = match tuple with (s, _) when s = string_name -> true 
    | _ false 

try 
    let x = List.find (predicate "query") tuples_list in 
    ... 
    with Not_found -> ... 

EDIT: một vị tốt hơn:

let predicate string_name (s, _) = s = string_name 

Tuy nhiên, giải pháp tốt hơn là sử dụng List.assoc mà hoạt động trên danh sách của các bộ, và xem xét các tuple được cặp khóa-giá trị:

try 
    let x = List.assoc "query" tuples_list in ... 
with Not_found -> ... 

Mặc dù giá trị trả lại là List.assoc là phần tử thứ hai của bộ (int trong trường hợp của bạn). Nếu bạn muốn giá trị của tuple, hoặc là tạo lại nó, hoặc sử dụng cách tiếp cận đầu tiên.

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