場景:
現在有一個list:[1,2,3,4,5,6],我需要把這個list在輸出的時候,是以一種隨機打亂的形式輸出,
專業點的術語:將一個容器中的資料每次隨機逐個遍歷一遍,
注意:不是生成一個隨機的list集,
環境:
Python 3.6
解決方案:
方案一:
有人可能會通過Random內置函式,來間接實作想要的結果,但是這種方式,太原始,也不夠優雅,而且有種重復造輪子的嫌疑,這里我就不貼我自己通過random實作的效果了,
方案二:
Random中有一個random.shuffle()方法提供了完美的解決方案,代碼如下:
x = [1,2,3,4,5,6]
random.shuffle(x)
print(x)
輸出結果:
第一次輸出內容:[6, 5, 1, 3, 2, 4]
第二次輸出內容:[6, 1, 3, 5, 2, 4]
第三次輸出內容:[5, 3, 1, 2, 4, 6]
從結果我們可以看出,輸出是完全隨機的,代碼量就兩行,不需要random,不需要for回圈,
原始碼解讀:
此部分原文鏈接:Python中打亂串列順序 random.shuffle()的使用方法
def shuffle(self, x, random=None):
"""Shuffle list x in place, and return None.
原位打亂串列,不生成新的串列,
Optional argument random is a 0-argument
function returning a random float in [0.0, 1.0);
if it is the default None,
the standard random.random will be used.
可選引數random是一個從0到引數的函式,回傳[0.0,1.0)中的隨機浮點;
如果random是預設值None,則將使用標準的random.random(),
"""
if random is None:
randbelow = self._randbelow
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = randbelow(i + 1)
x[i], x[j] = x[j], x[i]
else:
_int = int
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = _int(random() * (i + 1))
x[i], x[j] = x[j], x[i]
注意 :
從代碼的注釋,我們看到random.shuffle()是對原list做修改,如果需要保留原list,請注意這個細節,
本文首發于BigYoung小站
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/144266.html
標籤:Python
