場景:
現在有一個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小站