2011-06-23 43 views
7

Tôi đang tìm mẫu phù hợp với danh sách (có thể trống) bao gồm các đối tượng nguyên tử giống hệt nhau (theo nghĩa Equal []), nhưng tôi không thể tìm ra. Mọi sự trợ giúp sẽ rất được trân trọng.Mẫu để khớp với danh sách các phần tử giống hệt nhau

+0

Theo mẫu, bạn có muốn nói cụm từ thông dụng không? – Dan

+0

Bạn đã thử sử dụng PatternSequence chưa? http://reference.wolfram.com/mathematica/ref/PatternSequence.html –

+1

@Dan I Mathematica có _patterns_, tức là, các biểu thức có nghĩa là phù hợp với cấu trúc ngôn ngữ/dữ liệu Mathematica, và 'StringExpression' và 'RegularExpression' có nghĩa là cho _strings_ . Màu đỏ dường như đang đề cập đến các mẫu. –

Trả lời

12

Tất cả các câu trả lời cho đến nay dường như đã bỏ lỡ yêu cầu rằng các đối tượng được đối sánh cần phải là nguyên tử. Sau đây thực hiện điều này:

Cases[testList, {a___?AtomQ} /; Equal[a]] 

Nếu bạn không xác định giống hệt theo nghĩa Equal bạn có thể đã sử dụng:

Cases[testList, {(a_?AtomQ) ...}] 

Với một danh sách kiểm tra sửa đổi một chút bạn sẽ thấy các phương pháp khác không yêu cầu

testList = {{1, 1.0, 1.0}, {a, b, c}, {Exp[Pi] + 1, Exp[Pi] + 1, Exp[Pi] + 1}, {}, {3}}; 

tất cả đều khớp chính xác với phần tử thứ 3.

+0

+1 để đọc kỹ :) –

+0

Rất tiếc. Vâng, tôi hoàn toàn bỏ lỡ điều đó. –

+0

Cảm ơn bạn, ba phiên bản của bạn với hành vi phù hợp khác nhau một cách tinh tế là rất có tính hướng dẫn. – reddish

9

Tính năng này có phù hợp với bạn không?

testList = { 
    {1, 1.0, 1.}, 
    {a, b, c}, 
    {0, Exp[Pi*I] + 1.0, Sin[Pi]} 
} 
Cases[testList, _List?(Equal @@ # &)] 
+0

Tôi không biết tại sao, nhưng tôi thường có xu hướng quên cú pháp '_? (Cond)'. Ví dụ tốt đẹp để ghi nhớ nó. –

6

Sử dụng Condition, thay vì PatternTest:

In[31]:= testList = {{1, 1.0, 1.}, {a, b, c}, {0, Exp[Pi*I] + 1.0, 
    Sin[Pi]}, {}, {3}}; 

Cases[testList, {a___} /; Equal[a]] 

Out[32]= {{1, 1., 1.}, {0, 0., 0}, {}, {3}} 

(và mở rộng trên danh sách các trường hợp thử nghiệm của Mark để che danh sách rỗng và singleton.)

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