如何在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+ 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告