Python中打乱列表顺序 random.shuffle()的使用方法

本文介绍了如何使用Python的random模块中的shuffle方法来打乱列表的顺序,提供了一个简单的示例代码,展示了如何将列表中的元素随机排序,而不生成新的列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前自己一直使用random中 randint生成随机数以及使用for将列表中的数据遍历一次。
现在有个需求需要将列表的次序打乱,或者也可以这样理解:
【需求】将一个容器中的数据每次随机逐个遍历一遍。
random.shuffle()方法提供了完美的解决方案。
不会生成新的列表,只是将原列表的次序打乱

# shuffle()使用样例
import random

x = [i for i in range(10)]
print(x)
random.shuffle(x)
print(x)

源码及注释(个人翻译注释)

def shuffle(self, x, random=None):
    """Shuffle list x in place, and return None.
    原位打乱列表,不生成新的列表。

    Optional argument random is a 0-argument
    function returning a random float in [0.0, 1.0); 
    if it is the default None, 
    the standard random.random will be used.
	可选参数random是一个从0到参数的函数,返回[0.0,1.0)中的随机浮点;
	如果random是缺省值None,则将使用标准的random.random()。
    """

    if random is None:
        randbelow = self._randbelow
        for i in reversed(range(1, len(x))):
            # pick an element in x[:i+1] with which to exchange x[i]
            j = randbelow(i + 1)
            x[i], x[j] = x[j], x[i]
    else:
        _int = int
        for i in reversed(range(1, len(x))):
            # pick an element in x[:i+1] with which to exchange x[i]
            j = _int(random() * (i + 1))
            x[i], x[j] = x[j], x[i]

random 中其他的方法

class Random(_random.Random):

    ## -------------------- integer methods  -------------------
    def randrange(self, start, stop=None, step=1, _int=int):

    def randint(self, a, b):

    def _randbelow(self, n, int=int, maxsize=1 << BPF, type=type,
                   Method=_MethodType, BuiltinMethod=_BuiltinMethodType):

    ## -------------------- sequence methods  -------------------
    def choice(self, seq):

    def shuffle(self, x, random=None):

    def sample(self, population, k):

    def choices(self, population, weights=None, *, cum_weights=None, k=1):

    ## -------------------- uniform distribution -------------------
    def uniform(self, a, b):

    ## -------------------- triangular --------------------
    def triangular(self, low=0.0, high=1.0, mode=None):

    ## -------------------- normal distribution --------------------
    def normalvariate(self, mu, sigma):

    ## -------------------- lognormal distribution --------------------
    def lognormvariate(self, mu, sigma):

    ## -------------------- exponential distribution --------------------
    def expovariate(self, lambd):

    ## -------------------- von Mises distribution --------------------
    def vonmisesvariate(self, mu, kappa):

    ## -------------------- gamma distribution --------------------
    def gammavariate(self, alpha, beta):

    ## -------------------- Gauss (faster alternative) --------------------
    def gauss(self, mu, sigma):

    def betavariate(self, alpha, beta):

    ## -------------------- Pareto --------------------
    def paretovariate(self, alpha):

    ## -------------------- Weibull --------------------
    def weibullvariate(self, alpha, beta):
### Python `random.shuffle` 函数使用方法 #### 1. 功能概述 `random.shuffle()` 是 Python 的标准库 `random` 提供的一个函数,用于将可变序列(如列表中的元素随机重新排列。该函数会 **原地修改** 输入的序列,因此不会返回新的对象[^3]。 #### 2. 参数说明 `random.shuffle(x[, random])` 接受两个参数: - `x`: 待打乱顺序的可变序列(通常是列表)。如果传入的是不可变类型(如元组),则会抛出错误。 - `random`: (可选)自定义伪随机数生成器,默认情况下使用内置的 `random.random()` 方法。 #### 3. 示例代码 以下是几个典型的使用场景: ##### 示例 1: 基本用法 ```python import random original_list = [1, 2, 3, 4, 5] random.shuffle(original_list) print(original_list) # 输出可能为 [3, 1, 5, 2, 4], 结果每次运行都不同 ``` 此示例展示了如何对一个简单的整数列表进行随机排序[^3]。 --- ##### 示例 2: 自定义随机种子 为了实现可重复的结果,可以设置固定的随机种子: ```python import random seed_value = 42 random.seed(seed_value) data = [&#39;apple&#39;, &#39;banana&#39;, &#39;cherry&#39;] random.shuffle(data) print(data) # 输出固定结果,例如 [&#39;banana&#39;, &#39;cherry&#39;, &#39;apple&#39;] ``` 通过指定相同的种子值,无论程序运行多少次,都会得到一致的随机化结果[^1]。 --- ##### 示例 3: 应用于数据集划分 在机器学习项目中,常需将数据划分为训练集和测试集。以下是一个具体例子: ```python import random dataset = list(range(1, 11)) # 创建一个包含数字 110 的列表 random.shuffle(dataset) # 将数据随机打乱 split_point = int(len(dataset) * 0.7) # 训练集占总数据量的 70% training_set = dataset[:split_point] testing_set = dataset[split_point:] print("Training Set:", training_set) print("Testing Set:", testing_set) ``` 这段代码演示了如何利用 `random.shuffle()` 对数据进行预处理分割成两部分[^2]。 --- ##### 示例 4: 处理复杂结构的数据 对于嵌套列表或其他更复杂的输入形式,需要注意其行为特性: ```python import numpy as np complex_data = [ {"a": 1}, [{"b": 2}, {"c": 3}], [{"d": 4}] ] shuffled_data = np.random.permutation(complex_data).tolist() print(shuffled_data) # 子数组内部保持原有顺序,仅外层被打乱[^5] ``` 这里借助 NumPy 实现了一种扩展功能,适用于某些特殊需求下的随机重排。 --- #### 4. 注意事项 - 如果尝试对不可变类型的变量调用 `shuffle()`,将会引发异常。例如: ```python tuple_data = (1, 2, 3) random.shuffle(tuple_data) # TypeError: &#39;tuple&#39; object does not support item assignment ``` - 默认情况下,`shuffle()` 修改的是原始对象本身,而不是创建副本。如果希望保留初始状态,则应先复制一份再操作。 --- #### 5. 总结 综上所述,`random.shuffle()` 是一种高效便捷的方法来完成各种涉及随机性的任务,比如游戏开发、模拟实验以及数据分析等领域均能发挥重要作用[^4]。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值