Python 如何隨機打亂列表(List)排序


場景:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM