如何在 Python 中随机打乱对象列表?
在本文中,我们将向您展示如何在 Python 中随机打乱对象列表。以下是完成此任务的各种方法
使用 random.shuffle() 函数
使用 random.sample() 函数
使用 Fisher-Yates 洗牌算法
使用 random.randint() 和 pop() 函数
假设我们已经获取了一个包含一些元素的列表。我们将使用上面指定的不同方法随机打乱列表的元素。
使用 random.shuffle() 函数
random 模块中的 **shuffle()** 方法用于打乱列表。它接收一个序列(例如列表)并重新组织项目的顺序。
此 shuffle() 方法会 **更改** 原始列表,它不会返回新列表。在此过程中,列表的排序会丢失,这是此方法的唯一缺点。
语法
random.shuffle(sequence, function)
参数
**sequence** - 任何序列,例如列表、元组等。
**function(可选)** - 返回 0.0 到 1.0 之间的值的函数名称。如果未指定,将使用 random() 函数。
算法(步骤)
以下是执行所需任务的算法/步骤。
使用 import 关键字导入 **random** 模块。
创建一个变量来存储输入列表。
打印输入列表。
使用 **random.shuffle()** 函数通过将列表作为参数传递给它来随机打乱所有列表元素。
打印结果的随机列表。
示例
以下程序使用 random.shuffle() 函数返回随机列表。
# importing random module import random # input list inputList = [3, 10, 5, 9, 2] # Printing the input list print ("Input list: ", inputList) # shuffling the list of elements using the random module shuffle function random.shuffle(inputList) # Printing the shuffled list 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)
参数
**sequence** - 任何序列,例如列表、元组等
**k** - 要返回的元素数量
算法(步骤)
以下是执行所需任务的算法/步骤。
使用 import 关键字导入 **random** 模块
使用 **random.sample()** 函数通过传递输入列表和使用 len() 函数(len() 方法返回对象中的项目数)的输入列表长度作为参数来随机打乱所有列表元素。
打印结果的随机列表。
示例
以下程序使用 random.shuffle() 函数返回随机列表。
# importing random module import random # input list inputList = [3, 10, 5, 9, 2] # Printing the input list print ("Input list: ", inputList) # shuffling the list elements using the sample function shuffledList = random.sample(inputList, len(inputList)) # Printing the shuffled list print ("Shuffled list: ", shuffledList)
输出
执行上述程序后,将生成以下输出。
Input list: [3, 10, 5, 9, 2] Shuffled list: [2, 5, 9, 10, 3]
使用 Fisher-Yates 洗牌算法
这是 Python 中一个众所周知的算法,用于打乱数字序列。
Fisher-Yates 洗牌算法
Fisher-Yates 洗牌算法的时间复杂度为 O(n)。假设我们得到了函数 rand(),它在 O(1) 时间内生成一个随机数。其思想是从最后一个元素开始,将其与从整个数组(包括最后一个元素)中随机选择的元素交换。考虑从 0 到 n-2 的数组(大小减少一个),并重复此过程,直到我们到达第一个元素。
算法(步骤)
以下是执行所需任务的算法/步骤。
使用 for 循环从列表的末尾遍历,使用 **len() 函数**(返回对象中的项目数)
使用 random. **randint()** 方法(返回指定范围内的随机数)获取直到当前索引值的随机索引
将当前索引元素与随机索引处的元素交换
打印结果的随机列表。
示例
以下程序使用 Fisher-Yates 洗牌算法返回随机列表。
# importing random module import random # input list inputList = [3, 10, 5, 9, 2] # Printing the input list print ("Input list: ", inputList) # traversing from the end of the list(In reverse order) for p in range(len(inputList)-1, 0, -1): # getting a random index from 0 to the current index q = random.randint(0, p + 1) # Swap the current index element with the element at a random index inputList[p], inputList[q] = inputList[q], inputList[p] # Printing the shuffled list print ("Shuffled list: ", inputList)
输出
执行上述程序后,将生成以下输出。
Input list: [3, 10, 5, 9, 2] Shuffled list: [9, 10, 3, 5, 2]
使用 random.randint() 和 pop() 函数
**random.randint()** - 返回指定范围内的随机数
示例
以下程序使用 random.randint() 和 pop() 函数返回随机列表。
# importing random module import random # input list inputList = [3, 10, 5, 9, 2] # Printing the input list print("Input list: ", inputList) # getting the list length listLength = len(inputList) # repeating the loop till the length of the list for i in range(listLength): # getting a random index in the range 0 and list Length - 1 randomIndex = random.randint(0, listLength-1) # deleting the element at that corresponding index from the list ele= inputList.pop(randomIndex) # appending the above-deleted element to the input list(adding the element at last) inputList.append(ele) # Printing the shuffled list print ("Shuffled list: ", inputList)
输出
执行上述程序后,将生成以下输出。
Input list: [3, 10, 5, 9, 2] Shuffled list: [10, 2, 3, 5, 9]
结论
在本文中,我们学习了四种不同的 Python 方法来打乱给定的列表。我们还学习了用于打乱列表的 Fisher-Yates 算法以及如何在 Python 中使用它。