如何在Python中轻轻地打乱列表

2023-11-30

我遇到这个问题,我想对列表进行洗牌,但只能稍微做一些。比如说,我只想移动少量元素。有没有一种简单的方法可以完成这项工作?

现在我能想到的最好的方法是手动构建我自己的方法,但是有什么方法可以使用random图书馆为我做这个?


为了展示其中一些解决方案的作用,我发现多次运行蒙特卡罗算法并查看分布会有所帮助

首先是 @meta4 解决方案的整理版本,因为它是最充实的:

from random import randrange

def partial_shuffle(l, factor=5):
    n = len(l)
    for _ in range(factor):
        a, b = randrange(n), randrange(n)
        l[b], l[a] = l[a], l[b]

我们可以通过执行以下操作多次运行:

import numpy as np

n = 8
orig = list(range(n))
occur = np.zeros((n, n), int)

for _ in range(100000):
    x = orig[:]
    partial_shuffle(x,1)
    occur[orig,x] += 1

如果我们以百分比的形式打印出现次数表,我们会得到:

[[33.5  9.6  9.5  9.4  9.4  9.6  9.5  9.5]
 [ 9.6 33.2  9.7  9.5  9.6  9.6  9.4  9.4]
 [ 9.5  9.6 33.2  9.5  9.6  9.5  9.6  9.5]
 [ 9.5  9.3  9.6 33.4  9.5  9.5  9.5  9.6]
 [ 9.4  9.6  9.4  9.6 33.3  9.5  9.7  9.5]
 [ 9.6  9.5  9.6  9.6  9.4 33.3  9.5  9.6]
 [ 9.4  9.7  9.5  9.5  9.5  9.6 33.2  9.7]
 [ 9.5  9.5  9.6  9.5  9.7  9.5  9.6 33.2]]

每行代表该项目移动到该列的概率。在这种情况下(当n=8)该算法倾向于将元素留在原来的位置,大约 33% 的时间,然后均匀地选取剩余部分

然后我可以运行 pjs 代码的(整理后的)版本:

from random import gauss

orderliness = 2

occur = np.zeros((n, n), int)

for _ in range(100000):
    x = sorted(orig, key=lambda i: gauss(i * orderliness, 1))
    occur[orig,x] += 1

这给出了非常不同的输出:

[[91.9  7.9  0.1  0.   0.   0.   0.   0. ]
 [ 7.9 84.1  7.8  0.1  0.   0.   0.   0. ]
 [ 0.1  7.8 84.1  7.9  0.1  0.   0.   0. ]
 [ 0.   0.1  7.9 84.1  7.7  0.1  0.   0. ]
 [ 0.   0.   0.1  7.7 84.2  7.8  0.1  0. ]
 [ 0.   0.   0.   0.1  7.9 84.2  7.7  0.1]
 [ 0.   0.   0.   0.   0.1  7.7 84.2  7.9]
 [ 0.   0.   0.   0.   0.   0.1  7.9 91.9]]

即项目往往保持在接近它们开始的位置

这种表格非常适合检测分布中的偏差,而上面似乎没有证据表明这一点。但是,例如,使用 Artyom 的解决方案(shuffle(x, lambda: random() / 5)) 给出以下结果:

[[  0.   37.4   0.    0.    0.   16.7  23.8  22.1]
 [  0.    0.  100.    0.    0.    0.    0.    0. ]
 [  0.    0.    0.  100.    0.    0.    0.    0. ]
 [  0.    0.    0.    0.  100.    0.    0.    0. ]
 [  1.7   0.    0.    0.    0.   83.3  11.9   3. ]
 [  9.    7.4   0.    0.    0.    0.   64.2  19.4]
 [ 26.7  17.9   0.    0.    0.    0.    0.   55.5]
 [ 62.6  37.4   0.    0.    0.    0.    0.    0. ]]

这可能不是OP想要的。偏离对角线的高概率表示将数组旋转一个元素

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中轻轻地打乱列表 的相关文章

随机推荐

  • 使用VLC的虚拟界面时如何防止显示控制台

    我正在尝试从 Node js 服务器脚本以 虚拟 模式启动 VLC 但是使用child process spawn vlc I dummy 使用 Windows 时 为 VLC 的输出生成一个新的控制台窗口 有没有办法防止这种情况发生并强制
  • 基于文本输入字段创建动态链接

    我正在尝试创建一个文本输入字段 访问者可以在其中输入值 然后单击 执行 或 提交 根据数字 它们将被发送到新页面 例如 如果他们输入 123 并点击提交 则会将他们发送至http www example com page 123 有人可以帮
  • 过滤 OData 中的扩展实体

    如何对 OData 中的扩展实体应用过滤条件 假设我有主实体作为home有字段 homeId StateId CountyID Address 和子实体state as StateId StateName and county as Cou
  • 在 python 中将声音从网站转换为文本

    如何将网站上的声音转换为文本 当我单击网站中的按钮时会播放声音 但我的问题是如何在不使用麦克风的情况下将其转换为文本 仅使用网站和 python import speech recognition as sr r sr Recognizer
  • 回发或初始请求期间的 ASP.NET 事件顺序

    我能否从社区得到一些确认 证明我不会发疯 并且回发期间页面的生命周期实际上与最初请求页面时的顺序不同 如果是这种情况 我们将非常感谢指向概述顺序的参考文献 文章 回发相当于页面生命周期图像会很好 行为略有不同 但顺序相同 在这方面 回发 本
  • java.lang.ClassNotFoundException

    我正在开发一个 java 项目 该项目直到几天前才开始工作 我不确定我对 Eclipse 设置做了什么来控制它 但现在当我尝试运行一些访问 google Finance api 的代码时 我收到了 java lang ClassNotFou
  • 根据下拉列表选择从数据库填充另一个选择下拉列表

    我正在构建一个网站来学习编码 并尝试构建一个工具 用户可以在其中单击包含从数据库中提取的一些类别名称的选择 下拉菜单cat然后将出现另一个选择 其中包含从数据库中提取的子类别名称subcat 这几乎和 Yelp 的一模一样 进入类别 就像
  • 加载多种消息类型的设计模式

    当我浏览时 我遇到了一个关于处理多种消息类型 我关心的是 如何以简洁的方式加载这样的消息 我决定创建一个单独的类 其中的方法每次调用时都会加载一条消息 此方法应创建具体消息类型 例如 AlphaMessage BetaMessage Gam
  • C 编译器错误中的“需要左值”是什么意思? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 include
  • 如何在代码中配置我的Windows服务来访问桌面?

    我创建了一个Windows服务 我想从该服务打开一些基于 Windows 的应用程序 但我的 Windows 服务无法启动桌面应用程序 要启用访问权限 我必须执行以下步骤 打开管理工具 服务 右键单击我的服务并选择 属性 然后在 登录 选项
  • 如何使 clang 编译为 llvm IR

    我希望 clang 将我的 C C 代码编译为 LLVM 位代码而不是二进制可执行文件 我怎样才能做到这一点 如果我有 LLVM 位代码 如何进一步将其编译为二进制可执行文件 我想在编译为二进制可执行文件之前将一些我自己的代码添加到 LLV
  • 为什么 print_r 和 var_dump 在 echo 之前执行

    我正在打电话var dump or print r 在一个具有一个值的数组上echo陈述 echo br br testArray is gt var dump testArray lt br br 这是浏览器中的实际输出 array 0
  • Python 2 和 3 之间 numpy 数组的 Pickle 不兼容性

    我正在尝试加载链接的 MNIST 数据集here在 Python 3 2 中使用此程序 import pickle import gzip import numpy with gzip open mnist pkl gz rb as f l
  • Bash 脚本中的字符串连接

    我正在编写这个 Bash 脚本 count 0 result for d in ls 1 IMAGE DIR egrep jpg do if count 4 0 then result abc d if count gt 0 then ec
  • Foundation5 与 Symfony2 中的 Compass 和 Assetic

    我想在 Symfony2 中使用 Compass 和 Assetic 配置 Foundation5 我已经按照他们的说法安装了 Foundationhttp foundation zurb com docs sass html npm in
  • 组合来自名称向量的数据帧

    我有一个我认为很容易解决的问题 但我没有找到解决方案 我有大量的数据框想要按行绑定 为了避免列出所有数据框的名称 我使用 paste0 快速创建数据框名称的向量 问题是我无法使 rbind 函数从该名称向量中识别数据帧 更明确地说 df1
  • 如何在一张图片中找到另一张图片?

    我有 2 张 bmp 图像 ImageA 是屏幕截图 示例 ImageB 是其中的一个子集 举个例子 一个图标 我想找到图像中图像的 X Y 坐标 如果存在 知道我会怎么做吗 这是一个快速示例 但速度很慢 大约需要 4 6 秒 但它完全符合
  • jQuery滑块“slide”事件:如何确定用户的滑动方向?

    我一直在剖析 firebug 中的事件和 ui 对象 但它似乎没有任何我可以使用的东西 我错过了什么吗 我想我可以跟踪价值的变化 但这似乎是一个拼凑 selector slider slide function event ui I nee
  • C++ iptables 重定向形成单独的数据包

    我使用以下命令将端口 50 的所有流量重定向到 5050 iptables t nat A POSTROUTING p udp dport 50 j REDIRECT to port 5050 我在 5050 上使用 RAW 套接字进行监听
  • 如何在Python中轻轻地打乱列表

    我遇到这个问题 我想对列表进行洗牌 但只能稍微做一些 比如说 我只想移动少量元素 有没有一种简单的方法可以完成这项工作 现在我能想到的最好的方法是手动构建我自己的方法 但是有什么方法可以使用random图书馆为我做这个 为了展示其中一些解决