如何在 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 中使用它。

更新于: 2022年10月28日

9K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告