2013-03-22 36 views
5

Tôi đang sử dụng Scala 2.9 và muốn xây dựng danh sách dựa trên một số thao tác.kiểu chức năng để nhân hai danh sách với Scala

Hãy xem xét những điều sau đây, tôi có hai danh sách đơn giản:

 

    val l1 = List(2,3) 
    val l2 = List(List(4,5,6),List(7,8,9)) 

Các hành vi tôi muốn là như sau, một hoạt động với cả hai danh sách, như thế này:

 

    (2*4)+(3*7) 
    (2*5)+(3*8) 
    (2*6)+(3*9) 

Và tôi muốn để có kết quả là một danh sách khác có các giá trị này:

29,34,39

Tôi đã cố gắng giải quyết bằng mã nguồn ở trên. Tôi có lẽ đang nghĩ về điều này một cách hoàn toàn sai, nhưng tôi đang cố gắng để tìm ra một giải pháp thanh lịch.

 
    val lr = (l1,l2).zipped.map((t1:Int, t2:List[Int]) => 
     ... 
    )  
    println (lr) // should print List(29, 34, 39) 

Tuy nhiên, tôi thậm chí không chắc chắn nếu tôi đang ở đúng cách hoặc làm thế nào nên tôi liên tục. Bất cứ ai có thể nghĩ ra một giải pháp thanh lịch cho vấn đề của tôi?

+1

Điều này có thể hiển nhiên đối với bạn và những người khác, nhưng nó có thể đơn giản hóa suy nghĩ của bạn để nhận ra rằng đây là phép nhân ma trận, nơi bạn đã làm phẳng một trong các ma trận ('l1'.) Nếu bạn biểu diễn nó là 'val l1 = List (List) (1), Danh sách (2)) 'và chuyển đổi' l2' (hoặc ngược lại, tùy thuộc vào cách bạn đang đại diện cho ma trận của bạn) nó có thể nhiều hơn hiển nhiên. –

Trả lời

12

Đây là một trong những cách có thể, nhưng tôi không chắc chắn nếu nó là tao nhã:

l2.transpose.map(sl => (l1, sl).zipped.map{ case(x,y) => x*y }.sum) 
res: List[Int] = List(29, 34, 39) 

Theo @Tharabas và @ comments michael_s của, cuối cùng chúng tôi có một giải pháp nhỏ gọn hơn:

l2.transpose.map((l1,_).zipped.map(_*_).sum) 
+1

Bạn có thể rút gọn bản đồ bên trong thành '(_ * _)', nhưng ngoài ra, nó trông khá tao nhã với tôi. – Tharabas

+0

+1 Tôi đã không nghĩ rằng "chuyển vị" cung cấp một giải pháp rất ngắn gọn. – bhericher

+1

với chú thích Tharabas sẽ là (cũng loại bỏ 'sl'):' l2.transpose.map ((l1, _) .zip.map (_ * _). Sum) ' –

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