2011-10-28 35 views
14

Có cách nào đơn giản để RETURN một mảng xáo trộn bằng Python thay vì xáo trộn nó tại chỗ không?Trộn trong Python

ví dụ, thay vì

x = [array] 
random.shuffle(x) 

Tôi đang tìm một cái gì đó giống như

y = shuffle(x) 

mà duy trì x.

Lưu ý, tôi không tìm kiếm một chức năng, không phải cái gì đó như:

x=[array] 
y=x 
random.shuffle(x) 
+2

Thảo luận trong một bài đăng về python-ideas trong năm 2009, không khuyến khích vì bạn có thể viết 'y = được sắp xếp (yourList, key = lambda x: random.random())'. Xem: http://mail.python.org/pipermail/python-ideas/2009-March/003661.html –

Trả lời

17

sorted với một chức năng key mà trả về một giá trị ngẫu nhiên:

import random 
sorted(l, key=lambda *args: random.random()) 

Hoặc

import os 
sorted(l, key=os.urandom) 
+13

Đây là ngắn, nhưng quy mô như O (n log n), trong khi bản sao của danh sách đầu vào theo sau là 'random.shuffle' là O (n). Tham chiếu: http: //en.wikipedia.org/wiki/Shuffling # Shuffling_algorithms – EOL

+0

Thực hiện sau trên một chuỗi các chuỗi kết quả: sắp xếp (a, key = os.urandom) TypeError: đối tượng 'str' không thể được hiểu là số nguyên. Làm việc trước đây như mong đợi. Tôi tự hỏi nếu có một cách để làm sau này trên một mảng dây? – ntk4

8

Chỉ cần viết riêng bạn.

import random 

def shuffle(x): 
    x = list(x) 
    random.shuffle(x) 
    return x 

x = range(10) 
y = shuffle(x) 
print x # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
print y # [2, 5, 0, 4, 9, 3, 6, 1, 7, 8] 
+0

Cảm ơn, nhưng tôi đang cố gắng tiết kiệm công sức - phải bao gồm điều này trong tất cả các chương trình mà tôi viết là nỗ lực nhiều hơn là chỉ sử dụng công thức ban đầu. – Jeff

+1

Bạn muốn tôi thêm một cái gì đó một cách kỳ diệu vào thư viện chuẩn của Python? Tại sao bạn cần xáo trộn * bản sao * trong "tất cả các chương trình" mà bạn vẫn viết? – FogleBird

+6

Tôi không muốn bạn kỳ diệu làm bất cứ điều gì, tôi chỉ hỏi nếu một chức năng như vậy tồn tại trong một thư viện chuẩn. Tôi không cần bản sao cho mỗi lần, tôi muốn xác định một mảng như x = xáo trộn ([1 2 3 4 5]) thay vì phải xác định nó trên hai dòng. – Jeff

5

Không có chức năng nào bạn đang tìm kiếm. Chỉ cần sao chép một danh sách.

11

Sẽ khá đơn giản khi triển khai của riêng bạn bằng cách sử dụng random. Tôi sẽ viết nó như sau:

def shuffle(l): 
    l2 = l[:]   #copy l into l2 
    random.shuffle(l2) #shuffle l2 
    return l2   #return shuffled l2 
+2

+1: đây là O (n), trong khi 'sắp xếp (…, key = os.urandom)' là trong O (n log n). – EOL

2

Bạn có thể sử dụng numpy.random.permutation cho một trong hai một danh sách hoặc mảng, nhưng là đúng chức năng nếu bạn có một mảng numpy rồi. Đối với các danh sách có các loại hỗn hợp, chuyển đổi thành mảng có nhiều mảng sẽ thực hiện chuyển đổi loại.

import numpy as np 
my_list = ['foo', 'bar', 'baz', 42] 
print list(np.random.permutation(my_list)) 
# ['bar', 'baz', '42', 'foo'] 
+0

Đây là giải pháp tốt nhất cho câu hỏi này! – Ohumeronen

0

Sử dụng điều này như một bản demo nơi khác để nghĩ rằng nó có thể có giá trị chia sẻ:

import random 

x = shuffleThis(x) 


def shuffleThis(y): 
    random.shuffle(y) 
    return(y) 
#end of Shuffle Function 

Hy vọng điều này rất hữu ích.