问题内容
我正在使用 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()