一日一技:如何手动打乱一个列表

简介: 一日一技:如何手动打乱一个列表

摄影:产品经理产品经理亲手做的法式香煎鹅肝

我们知道,在 Python 里面,可以使用 random.shuffle打乱一个列表,如下图所示:

那么,如果我们要自己写一个打乱列表的算法,应该怎么写呢?

我们可以使用Fisher–Yates shuffle[1] 算法。这个算法的基本思想是:

  1. 从列表中任选一个数字,把它跟最后一个数字交换。
  2. 从列表索引为0-(n-2)中任选一个数字,把它和倒数第二位交换。
  3. 从列表索引为0-(n-3)位中,任选一个数字,把它和倒数第三位交换。
  4. 从索引为0,1中任选一个数字,把它和索引为1的数字交换。

具体的代码实现非常简单:



import random
def shuffle(target):    for change in range(len(target) - 1, 0, -1):        lower = random.randint(0, change)        target[lower], target[change] = target[change], target[lower]

这个一个 in-place操作,直接修改原列表,所以不需要返回。

运行效果如下图所示:

每次运行,它的结果都是不一样的。

目录
相关文章
|
3月前
|
算法
快速打乱一个数组排序的方式有哪些?
快速打乱一个数组排序的方式有哪些?
49 0
|
3月前
|
搜索推荐 算法 Python
如何实现归并排序算法? 要求:编写一个Python函数,输入一个无序列表,返回排序后的列表。
如何实现归并排序算法? 要求:编写一个Python函数,输入一个无序列表,返回排序后的列表。
40 2
|
1月前
|
算法 安全 Java
使用Collections.shuffle打乱集合顺序
使用Collections.shuffle打乱集合顺序
|
3月前
|
存储 Python
使用元组创建列表并实现反转效果
使用元组创建列表并实现反转效果
19 1
|
3月前
最短代码实现随机打乱数组各个元素的顺序
最短代码实现随机打乱数组各个元素的顺序
|
3月前
|
算法 索引 Python
如何实现二分查找算法? 要求:编写一个Python函数,输入一个有序列表和一个目标值,返回目标值在列表中的索引。如果目标值不在列表中,返回-1。
如何实现二分查找算法? 要求:编写一个Python函数,输入一个有序列表和一个目标值,返回目标值在列表中的索引。如果目标值不在列表中,返回-1。
55 0
|
9月前
|
JavaScript Python
从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
53 0
python实现将给定列表划分为元素和大致相等的两个子列表
python实现将给定列表划分为元素和大致相等的两个子列表
|
JSON 数据格式 Python
一日一技:包含非hashable元素的列表如何去重并保持顺序?
一日一技:包含非hashable元素的列表如何去重并保持顺序?
99 0