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