问题内容 我正在使用 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() 生成的元组?的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 如何有效地打乱 itertools.combinations() 生成的元组?
本文链接: https://lsjlt.com/news/567176.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0