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

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

PHPz
發布: 2024-02-22 12:43:11
轉載
680 人瀏覽過

如何有效地打乱 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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板