首頁  >  文章  >  後端開發  >  如何有效地打亂 itertools.combinations() 產生的元組?

如何有效地打亂 itertools.combinations() 產生的元組?

PHPz
PHPz轉載
2024-02-22 12:43:11608瀏覽

如何有效地打乱 itertools.combinations() 生成的元组?

問題內容

我正在使用 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除