问题内容
我正在使用 itertools.combinations() 基于非重复元素列表生成两项元组列表。然后我将生成的列表打乱。然而,元组本身的内容是按时间顺序组织的。例如,运行以下代码:
import randomimport itertoolsitems = ["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()
登录后复制
以上就是如何有效地打乱 itertools.combinations() 生成的元组?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2211989.html