打乱列表
在这个程序中,我想通过随机选择列表中的两个项目并交换它们的位置来打乱一个列表,然后重复这个过程好几次。
我遇到的问题是,我不知道怎么交换这些项目并打印出打乱后的列表。
比如说,如果我随机选出的两个值是a和b,如果我只是写:
a = b
b = a
那么这会把a的值改成b,但当它尝试把b改成a时,就不会有任何变化,因为a已经被改成b了。
我能想到的唯一方法是同时交换它们,但我不知道有什么函数或者方法可以做到这一点。
另外,如果a和b是列表L中的项目,在我交换它们之后,如果我使用
print L
它应该打印出修改后的版本吗?我之所以问这个,是因为根据我尝试的结果,它并没有这样做。
另外,我想通过逐步交换的方式来打乱这个列表,而不是使用从random库导入的shuffle函数。
5 个回答
4
random.shuffle 函数也使用了交换的方式。查看一下它的 源代码 会很有帮助:
def shuffle(self, x, random=None, int=int):
"""x, random=random.random -> shuffle list x in place; return None.
Optional arg random is a 0-argument function returning a random
float in [0.0, 1.0); by default, the standard random.random.
"""
if random is None:
random = self.random
for i in reversed(xrange(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]
注意最后一行是如何通过 元组的打包和解包 来进行交换的。
除了打包和解包,传统的交换变量的方法是使用一个临时变量:
t = x[i]
x[i] = x[j]
x[j] = t
4
在Python中,你可以这样交换两个变量的值:
a, b = b, a
这被称为多重赋值,你可以在这里找到更多相关信息。
在其他编程语言中,通常是通过先用一个临时变量来完成交换:
tmp = a
a = b
b = tmp
Python真是太棒了!
3
对于你的第一个问题,使用一个临时变量:
temp = a
a = b
b = temp
在Python中,你也可以这样做:
a, b = b, a
我怀疑你的第二个问题是因为你在修改从列表中取出的东西,而不是直接修改列表本身。试试这个:
i, j = # two indexes to swap in the list
L[i], L[j] = L[j], L[i]