如何在python中正确打乱列表
Posted
技术标签:
【中文标题】如何在python中正确打乱列表【英文标题】:how to shuffle a list correctly in python 【发布时间】:2013-11-10 16:34:18 【问题描述】:我有这段代码可以打乱一个列表。我首先将它分成两个列表,因为我有一个交错函数,可以交错 2 个列表:
def shuffle(xs, n=1):
il=list()
if len(xs)%2==0:
stop=int(len(xs)//2)
a=xs[:stop]
b=xs[stop:]
print(a)
print(b)
else:
stop=int(len(xs)//2)
a=xs[:stop]
b=xs[stop:]
print(a)
print(b)
if n>0:
for i in range(n):
shuffle=interleave(a,b)
else:
return
return shuffle
当我测试它时:
>>> shuffle([1,2,3,4,5,6,7],1)
[1, 2, 3]
[4, 5, 6, 7]
1
[7]
[7, 4]
[1, 4, 2, 5, 3, 6, 7, 4]
什么是列表中的 4 两次,为什么它打印 1、[7]、7,4]??
编辑:
def interleave(xs,ys):
a=xs
b=ys
minlength=[len(a),len(b)]
extralist= list()
interleave= list()
for i in range((minval(minlength))):
pair=a[i],b[i]
interleave.append(pair)
flat=flatten(interleave)
c=a+b
if len(b)>len(a):
remainder=len(b)-len(a)
for j in range(remainder,-1,-1):
extra=b[-j]
extralist.append(extra)
if len(a)>len(b):
remainder=len(a)-len(b)
for j in range(remainder,-1,-1):
extra=a[-j]
extralist.append(extra)
del extralist[-1]
final=flat+extralist
return final
【问题讨论】:
其实是调用interleave方法的时候出现的问题。请提供该方法的代码。 您的奇数/偶数长度条件的两侧看起来与我相同。 @scriptmonster 我在我的问题中添加了 interleave 方法 【参考方案1】:为什么不直接使用标准库?
>>> from random import shuffle
>>> l = list(range(1,20))
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> shuffle(l)
>>> l
[17, 15, 9, 13, 19, 7, 10, 18, 5, 1, 12, 3, 2, 16, 4, 14, 8, 6, 11]
>>>
【讨论】:
我认为他想要交错/花边而不是真正的洗牌。【参考方案2】:假设您想要交错列表,您可以编写一个简单的递归函数来执行 n 次。我相信,交错列表的一件事是第一个字符和最后一个字符将始终相同。
def shuffle(lst, num):
'''
lst - is a list
num - is the amount of times to shuffle
'''
def interleave(lst1,lst2):
'''
lst1 and lst2 - are lists to be interleaved together
'''
if not lst1:
return lst2
elif not lst2:
return lst1
return lst1[0:1] + interleave(lst2, lst1[1:])
while num > 0:
lst = interleave(lst[:len(lst)/2], lst[len(lst)/2:])
print lst
num -= 1
return lst
【讨论】:
以上是关于如何在python中正确打乱列表的主要内容,如果未能解决你的问题,请参考以下文章
Python面试必考重点之列表,元组和字典第四关——编写一个函数(不要使用python模块的函数),打乱列表元素的顺序/如何对列表元素进行随机排列