如果你想在Python中对一个列表(数组)的元素进行洗牌(随机排序),可以使用标准库的随机模块。
有两个函数:shuffle(),对原始列表进行随机排序;sample(),返回一个新的随机排序的列表。 sample()可以用于字符串和图元。
- 洗涤原始清单:
random.shuffle()
- 生成一个新的、经过洗牌的名单。:
random.sample()
- 洗涤字符串和图元
- 固定随机数种子
如果你想按升序或降序而不是随机排序,或按逆序排序,请看下面的文章。
洗涤原始清单: random.shuffle()
随机模块中的函数shuffle()可以对原始列表进行随机排序。
import random
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
random.shuffle(l)
print(l)
# [1, 0, 4, 3, 2]
生成一个新的、经过洗牌的名单。: random.sample()
随机模块中的函数sample()可以用来创建一个随机排序的新列表,而不改变原始列表。
sample() 是一个从列表中随机选择和检索一个元素的函数。第一个参数是一个列表,第二个参数是要检索的元素的数量。详情请见下面的文章。
如果由sample()选择的元素数量是列表中的元素总数,我们就会得到一个新的列表,所有元素都被随机排序。列表中元素的总数由len()得到。
原始对象不会被改变。
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
lr = random.sample(l, len(l))
print(lr)
# [0, 3, 1, 4, 2]
print(l)
# [0, 1, 2, 3, 4]
洗涤字符串和图元
字符串和图元是不可变的,所以如果你使用random.shuffle()来改变原始对象,你会得到以下错误。TypeError
s = 'abcde'
# random.shuffle(s)
# TypeError: 'str' object does not support item assignment
t = tuple(range(5))
print(t)
# (0, 1, 2, 3, 4)
# random.shuffle(t)
# TypeError: 'tuple' object does not support item assignment
如果你想对一个字符串或元组进行洗牌,请使用random.sample(),它会创建一个新对象。
即使指定一个字符串或元组作为参数,random.sample()也会返回一个列表,所以有必要将其处理成一个字符串或元组。
在字符串的情况下,它将是一个逐个字符的列表。要把它们再次串联成一个字符串,请使用join()方法。
sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca
对于元组,使用tuple(),它从一个列表中创建一个元组。
tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)
固定随机数种子
通过给随机模块的函数seed()提供一个任意的整数,可以固定随机数种子并初始化随机数发生器。
用相同的种子初始化后,总是以相同的方式重新排序。
l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]
l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]