功能上改组列表

时间:2017-11-06 11:53:33

标签: python list random

关于随机模块的random.shuffle方法,堆栈溢出有很多questions

让我对shuffle感到烦恼的一点是,它在原地洗牌而不是返回一个洗牌的副本。

  

请注意,shuffle适用于其中,并返回None。

因此表达式如

for index, (parent1, parent2) in enumerate(zip(sorted(population)[::2], shuffle(population)[1::2])):

不能工作。用副作用写它似乎不必要地冗长:

other_half = population[1::2]
random.shuffle(other_half)
for index, (parent1, parent2) in enumerate(zip(sorted(population)[::2], other_half):

什么是功能性改组列表的pythonic方式?

2 个答案:

答案 0 :(得分:2)

一个很好的选择是random.sample,其中k是列表的len

import random

li = [1, 2, 3, 4, 5]

for _ in range(4):  # showing we get a new, 'shuffled' list
    print(random.sample(li, len(li)))

# [5, 2, 3, 1, 4]
# [1, 5, 4, 3, 2]
# [4, 2, 5, 1, 3]
# [4, 2, 3, 5, 1]

答案 1 :(得分:2)

这看起来像是this question

的副本

接受的答案是

shuffled = sorted(x, key=lambda k: random.random())