2009-06-20 31 views
67

Tôi nhận được như là một danh sách đầu vào của chuỗi và cần phải trả về một danh sách với các chuỗi tương tự nhưng theo thứ tự ngẫu nhiên. Tôi phải cho phép trùng lặp - cùng một chuỗi có thể xuất hiện một lần hoặc nhiều hơn trong đầu vào và phải xuất hiện cùng một số lần trong đầu ra.Cách tốt nhất để phân ngẫu nhiên danh sách các chuỗi trong Python

Tôi thấy một số "sức mạnh vũ phu" cách để làm điều đó (sử dụng vòng lặp, thần cấm), một trong số đó tôi hiện đang sử dụng. Tuy nhiên, biết rằng Python có thể là một lớp lót tuyệt vời để hoàn thành công việc, đúng không?

+0

có thể trùng lặp của [Xáo trộn một danh sách các đối tượng trong python] (http://stackoverflow.com/questions/ 976882/shuffling-a-list-of-đối tượng-in-python) –

Trả lời

175
>>> import random 
>>> x = [1, 2, 3, 4, 3, 4] 
>>> random.shuffle(x) 
>>> x 
[4, 4, 3, 1, 2, 3] 
>>> random.shuffle(x) 
>>> x 
[3, 4, 2, 1, 3, 4] 
+1

random.shuffle (range (5)) .. không có vẻ để làm việc với danh sách được tạo ra khi bay: ( – user1019129

+6

@ user1019129 'random.shuffle' xáo trộn các danh sách tại chỗ. Trong Python 3,' range (5) 'là một trình tạo, không phải là một danh sách trong Python 2,' range (5) 'là một danh sách, bu t shuffle là tại chỗ, vì vậy nó shuffles một danh sách tạm thời mà là ngay lập tức vứt bỏ. Bạn có thể làm 'x = range (5); random.shuffle (x) 'và sau đó sử dụng' x'. –

3

Bạn sẽ phải đọc những chuỗi thành một mảng và sau đó sử dụng một thuật toán xáo trộn. Tôi khuyên bạn nên Fisher-Yates shuffle

+0

Dựa trên một nháy mắt tại bài viết Wikipedia, có vẻ như đó là nhiều hơn hoặc ít hơn những gì nó đang làm anyway. Bạn có thể đọc mã trong C: \ Python26 \ Lib \ random.py (hoặc tương đương với các hệ điều hành khác) và có vẻ như nó đang làm điều tương tự được mô tả ở đây: http://en.wikipedia.org/wiki/Fisher%E2 % 80% 93Yates_shuffle # Modern_method – MatrixFrog

4

Cho một xâu mục, đây là một lớp lót:

''.join([str(w) for w in random.sample(item, len(item))]) 
Các vấn đề liên quan