如何在Python中洗牌对象列表?
在本文中,我们将向您展示如何在Python中洗牌对象列表。以下是实现此任务的各种方法:
- 使用random.shuffle()函数
-
使用random.sample()函数
-
使用Fisher-Yates洗牌算法
-
使用random.randint()和pop()函数
假设我们有一个包含某些元素的列表。我们将使用上述不同的方法随机洗牌列表的元素。
阅读更多:Python 教程
使用random.shuffle()函数
random模块中的shuffle()方法用于洗牌列表。它接受一个序列,例如列表,并重新组织项目的顺序。
此shuffle()方法更改原始列表,不会返回新列表。此过程中失去了列表的顺序,这是此方法的唯一缺点。
语法
random.shuffle(sequence, function)
参数
- 序列 - 任何序列,如列表、元组等。
-
function(可选) - 返回0.0到1.0之间的值的函数名称。如果未指定,将使用random()函数。
算法(步骤)
执行所需任务的算法/步骤如下:
- 使用import关键字导入random模块。
-
创建一个变量以存储输入列表。
-
打印输入列表。
-
使用random.shuffle()函数通过将列表作为参数传递来随机洗牌所有列表元素。
-
打印结果随机洗牌的列表。
示例
以下程序使用random.shuffle()函数返回洗牌列表:
#导入random模块
import random
#输入列表
inputList = [3, 10, 5, 9, 2]
#打印输入列表
print ("Input list: ", inputList)
#使用random模块shuffle函数洗牌元素列表
random.shuffle(inputList)
#打印洗牌列表
print ("Shuffled list: ", inputList)
输出
在执行上述程序时,将生成以下输出-
Input list: [3, 10, 5, 9, 2]
Shuffled list: [9, 3, 10, 2, 5]
使用random.sample()函数
python中的random.sample()方法返回一个新的洗牌列表。原始列表保持不变。
random.sample()方法返回一个包含从序列中随机选择的元素数量的列表。
语法
random.sample(sequence, k)
参数
- 序列 - 任何序列,如列表、元组等。
-
k - 返回的元素数量
算法(步骤)
执行所需任务的算法/步骤如下:
- 使用import关键字导入 random 模块。
-
使用 random.sample() 函数通过传递输入列表和使用len()函数(len()方法返回对象中的项目数)作为参数以随机方式混洗所有列表元素的长度来随机混洗所有列表元素。
-
打印结果混洗列表。
示例
以下程序使用random.shuffle()函数返回混洗列表-
#导入random模块
import random
#输入列表
inputList=[3, 10, 5, 9, 2]
#打印输入列表
print ("输入列表:", inputList)
#使用样本函数混洗列表元素
shuffledList = random.sample(inputList, len(inputList))
#打印混洗列表
print ("混洗列表:", shuffledList)
输出
在执行上述程序时,将生成以下输出-
输入列表:[3, 10, 5, 9, 2]
混洗列表:[2, 5, 9, 10, 3]
使用Fisher-Yates shuffle算法
这是一种在Python中使用的著名算法,用于混洗数字序列。
Fisher-Yates shuffle算法
Fisher-Yates shuffle算法的时间复杂度为O(n)。假设我们给出了函数rand(),它以O(1)时间生成一个随机数字。其思想是从最后一个元素开始,并将其与整个数组中(包括最后一个元素)的随机选择元素交换。考虑从0到n-2的数组(大小减少了一个)并重复该过程,直到到达第一个元素为止。
算法(步骤)
以下是要执行所需任务的算法/步骤–。
- 使用for循环遍历列表的末尾,使用 len()函数 (返回对象中的项目数)。
-
使用random. randint() 方法获取当前索引值的随机索引(返回指定范围内的随机数)。
-
将当前索引元素与随机索引处的元素交换。
-
打印结果混洗列表。
示例
以下程序使用Fisher-Yates shuffle算法返回混洗列表-
# 导入 random 模块
import random
# 定义输入列表
inputList = [3, 10, 5, 9, 2]
# 打印输入列表
print ("输入列表: ", inputList)
# 从列表的末尾开始遍历(倒序)
for p in range(len(inputList)-1, 0, -1):
# 从 0 到当前索引获取一个随机索引
q = random.randint(0, p + 1)
# 将当前索引元素与随机索引处的元素交换
inputList[p], inputList[q] = inputList[q], inputList[p]
# 打印已洗牌的列表
print ("已洗牌的列表: ", inputList)
输出
执行上述程序后会生成以下输出 –
输入列表: [3, 10, 5, 9, 2]
已洗牌的列表: [9, 10, 3, 5, 2]
使用 random.randint() 和 pop() 函数
random.randint() − 返回指定范围内的随机数。
例子
以下程序使用 random.randint() 和 pop() 函数返回洗牌列表 –
# 导入 random 模块
import random
# 定义输入列表
inputList = [3, 10, 5, 9, 2]
# 打印输入列表
print("输入列表: ", inputList)
# 获取列表长度
listLength = len(inputList)
# 重复循环直到列表长度
for i in range(listLength):
# 在范围 0 和 list length-1 中获取一个随机索引
randomIndex = random.randint(0, listLength-1)
# 删除列表中相应索引处的元素
ele= inputList.pop(randomIndex)
# 将上述删除的元素添加到列表末尾(在最后添加元素)
inputList.append(ele)
# 打印已洗牌的列表
print ("已洗牌的列表: ", inputList)
输出
执行上述程序后会生成以下输出 –
输入列表: [3, 10, 5, 9, 2]
已洗牌的列表: [10, 2, 3, 5, 9]
结论
在本文中,我们学习了四种不同的 Python 方法来洗牌给定列表。我们还学习了 Fisher-Yates 算法生成的洗牌列表以及如何在 Python 中使用它。
极客教程