我正在使用 itertools.combinations()
基於非重複元素清單產生兩個元組清單。然後我將生成的列表打亂。然而,元組本身的內容是按時間順序組織的。例如,運行以下程式碼:
import random import itertools items = ["a","b","c","d","e"] item_combos = list(itertools.combinations(items, 2)) random.shuffle(item_combos) print(item_combos)
輸出:
['a', 'b', 'c', 'd', 'e'] [('b', 'd'), ('a', 'e'), ('b', 'c'), ('a', 'd'), ('a', 'b'), ('a', 'c'), ('c', 'e'), ('c', 'd'), ('b', 'e'), ('d', 'e')]
字元在元組中按它們出現在輸入列表中的時間排序(不是按字母順序排列,輸入列表只是碰巧按字母順序排序。打亂列表並不能解決問題,只是將其隱藏)。 「c」將始終出現在「d」的左側,而「a」將始終出現在其他所有內容的左側。
我的解決方案是簡單地將所有元組替換為打亂的元組(如下所示)。這可行,但事實證明速度非常慢,尤其是在較大的清單上。
for i in range(len(item_combos)): item_combos[i] = tuple(random.sample(item_combos[i], 2))
有沒有更快的方法可以產生類似的輸出?
選擇隨機元組進行反轉,而不是打亂每個元組,工作速度要快得多。這具有相同的結果,因為 item_combos
中的每個元組僅包含兩個項目。
新元組「加擾」程式碼:
for i in range(len(item_combos)): if random.random()<.5: item_combos[i] = item_combos[i][::-1]
以上是如何有效地打亂 itertools.combinations() 產生的元組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!