2009-07-21 25 views
13

cho hai chuỗi, cách lấy tất cả các phần tử thuộc cả chuỗi hoặc tất cả các phần tử duy nhất cho một trong số chúng?F # Seq diff

Ví dụ:

let a = [1..10] 
let b = [3; 5; 7] 

Làm thế nào để tính toán 3 5 và 7 (tất cả các yếu tố chung cho cả hai danh sách) và 1, 2, 4, 6, 8, 9, 10 (tất cả các yếu tố không chung)

Cảm ơn

+0

Bạn có thể cho một ví dụ? – Dario

Trả lời

11

Những gì bạn muốn làm là không nhiều hơn các hoạt động thiết lập đơn giản của intersectiondifference (hoặc bổ sung tương đối).

F # có mô-đun Set để giúp chúng tôi ở đây. Điều này sẽ thực hiện công việc:

let a = [1 .. 10] 
let b = [3; 5; 7] 

let intersection = Set.intersect (Set.ofList a) (Set.ofList b) 
let difference = (Set.ofList a) - (Set.ofList b) 

Sau đó, bạn có thể chuyển đổi kết quả thành danh sách bằng cách sử dụng Set.toList, nếu muốn. Khi Mehrdad chỉ ra, điều này có thể được thực hiện bằng cách sử dụng LINQ (hoặc thậm chí là lớp HashSet trong BCL), nhưng cách tiếp cận ở đây dường như là nhất trong tinh thần của ngôn ngữ F # (chắc chắn là cú pháp tốt nhất, và có lẽ là hiệu quả nhất quá).

+1

Điều cần suy nghĩ là bằng cách chuyển đổi danh sách thành một tập hợp, chỉ các giá trị riêng biệt được giữ nguyên (định nghĩa của một tập hợp). Câu trả lời được đưa ra bởi Mehrdad (sử dụng phương pháp Linq-Enumerable) sẽ giữ tất cả các giá trị, thậm chí cả những giá trị khác biệt. Đôi khi điều này không phải là một vấn đề nhưng tôi chỉ muốn chỉ ra điều đó. – polkduran

+1

(Set.of_list a) - (Set.of_list b) không giao hoán – Indy9000

4

không rất F # -y cách tôi biết. Bạn luôn có thể sử dụng thư viện .NET. seq<T> chỉ là IEnumerable<T>, không có gì đặc biệt:

let diff = System.Linq.Enumerable.Except(seq1, seq2); // seq1 - seq2 
let intersect = System.Linq.Enumerable.Intersect(seq1, seq2); 
let symdiff = System.Linq.Enumerable.Union(System.Linq.Enumerable.Except(seq1, seq2), System.Linq.Enumerable.Except(seq2, seq1)); 
+1

Chúng hoạt động, nhưng tôi nghĩ thật lạ khi một ngôn ngữ hoạt động quá nhiều với các chuỗi không có các phương thức riêng (hoặc bí danh) cho một tác vụ phổ biến như vậy ... – pistacchio

+1

Đồng ý. Có thể có một cách F # y hơn. Chỉ đề cập đến khả năng. Đang chờ câu trả lời tốt hơn. –

8

Hơi nhỏ gọn hơn:

let a = set [0;1;2;3] 
let b = set [2;3;4;5] 
let c = a - b 
let d = b - a 
let e = Set.intersect a b 
let f = a + b 
> 
val c : Set<int> = seq [0; 1] 
val d : Set<int> = seq [4; 5] 
val e : Set<int> = seq [2; 3] 
val f : Set<int> = seq [0; 1; 2; 3; ...] 

Danny

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