Shuffle a list and return a copy

安稳与你 提交于 2020-01-05 03:25:33

问题


I want to shuffle an array, but all I find was method like random.shuffle(x), from Best way to randomize a list of strings in Python

Can I do something like

import random
rectangle = [(0,0),(0,1),(1,1),(1,0)]
# I want something like
# disorderd_rectangle = rectangle.shuffle

Now I can only get away with

disorderd_rectangle = rectangle
random.shuffle(disorderd_rectangle)
print(disorderd_rectangle)
print(rectangle)

But it returns

[(1, 1), (1, 0), (0, 1), (0, 0)]
[(1, 1), (1, 0), (0, 1), (0, 0)]

So the original array is also changed. How can I just create another shuffled array without changing the original one?


回答1:


People here are advising deepcopy, which is surely an overkill. You probably don't mind the objects in your list being same, you just want to shuffle their order. For that, list provides shallow copying directly.

rectangle2 = rectangle.copy()
random.shuffle(rectangle2)

About your misconception: please read http://nedbatchelder.com/text/names.html#no_copies




回答2:


Use copy.deepcopy to create a copy of the array, shuffle the copy.

c = copy.deepcopy(rectangle)
random.shuffle(c)



回答3:


You need to make a copy of the list, by default python only creates pointers to the same object when you write:

disorderd_rectangle = rectangle

But instead use this or the copy method mentioned by Veky.

disorderd_rectangle = rectangle[:]

It will make a copy of the list.




回答4:


Use a slice to make a shallow copy, then shuffle the copy:

>>> rect = [(0,0),(0,1),(1,1),(1,0)]
>>> sh_rect=rect[:]
>>> random.shuffle(sh_rect)
>>> sh_rect
[(0, 1), (1, 0), (1, 1), (0, 0)]
>>> rect
[(0, 0), (0, 1), (1, 1), (1, 0)]


来源:https://stackoverflow.com/questions/30253198/shuffle-a-list-and-return-a-copy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!