在Python中对列表中的元素进行洗牌

商业

如果你想在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]