打乱 Python 列表
Posted
技术标签:
【中文标题】打乱 Python 列表【英文标题】:Scramble Python List 【发布时间】:2012-04-03 23:13:35 【问题描述】:在我问我的问题之前,让我直说......
这不是Does anyone know a way to scramble the elements in a list? 和Shuffle an array with python, randomize array item order with python 的重复。我会解释为什么...
我想知道如何打乱一个数组,并制作一个新副本。因为random.shuffle()
修改了列表(并返回None
),所以我想知道是否有其他方法可以做到这一点,所以我可以做到scrambled=scramblearray()
。如果没有内置函数,我可以定义一个函数来执行此操作。
【问题讨论】:
制作一个新副本,然后打乱它有什么问题? Shuffle an array with python的可能重复 @Marcin 就个人而言,我不认为这些答案可以与Shuffle an array with Python上的答案合并 是的,他们可以。他们碰巧也证明了你可以复制一个数组。你没有理由不能自己解决这个问题。 我认为您应该可以制作数组的新副本并使用random.shuffle()
对其进行加扰。它工作正常。如果你不喜欢这种方式,你可能应该清楚地解释为什么你不想要。这将有助于我们理解。
【参考方案1】:
def scrambled(orig):
dest = orig[:]
random.shuffle(dest)
return dest
及用法:
import random
a = range(10)
b = scrambled(a)
print a, b
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [6, 0, 2, 3, 1, 7, 8, 5, 4, 9]
【讨论】:
【参考方案2】:使用排序()。它返回一个新列表,如果您使用随机数作为密钥,它将被打乱。
import random
a = range(10)
b = sorted(a, key = lambda x: random.random() )
print a, b
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [5, 9, 0, 8, 7, 2, 6, 4, 1, 3]
【讨论】:
【参考方案3】:复制数组然后打乱它:
import random
array = range(10)
newarr = array[:] # shallow copy should be fine for this
random.shuffle(newarr)
#return newarr if needs be.
zip(array, newarr) # just to show they're different
Out[163]:
[(0, 4),
(1, 8),
(2, 2),
(3, 5),
(4, 1),
(5, 6),
(6, 0),
(7, 3),
(8, 7),
(9, 9)]
【讨论】:
以上是关于打乱 Python 列表的主要内容,如果未能解决你的问题,请参考以下文章
Python面试必考重点之列表,元组和字典第四关——编写一个函数(不要使用python模块的函数),打乱列表元素的顺序/如何对列表元素进行随机排列