2017-02-28 38 views
0

我在这里看过一些主题,因为我没有完全消化它或使我的代码工作。 这很简单,但我一直有很多问题与此所以在这里,它是:从头换换和洗牌

lst = ["a", "b", "c", "d"] 

我试图通过引用它们的位置交换两个元素的列表列表中,到目前为止,我,

编辑我不能使用替代掉在Python

def swap(i, j, lst): 
    placehold_swap = j 
    j = i 
    i = placehold_swap 

我一直在想做这样的事情,以便更新列表的顺序

lst = lst 

显然这是行不通的。我的第一反应是做

return lst 

但在分配我不能使用返回或打印,我只允许修改LST

下一个步骤是创建一个内部的另一个函数循环,从列表中交换随机元素100+次

import random 
def shuffle(lst): 

    for i in range (100): 
     placehold_shuffle = [] 
     choose1 = random.randint(0, len(lst)-1) 
     choose2 = random.randint(0, len(lst)-1) 
     placehold_shuffle = swap(choose1, choose2, lst) 

洗牌的名单,我不允许有一个回报LST或任何类型的回报这么认为我应该有一个表= [事端g]循环内部或外部的某个地方,以便一旦某物被洗牌,它将其保存为更新列表,然后在循环内再次洗牌,但我不知道该怎么做,我也没有玩过因为我无法获得我的第一个功能。

跟进*

我有我的两个函数的工作是这样的:

def swap(i, j, lst): 
    placehold_swap = lst[j] 
    lst[j] = lst[i] 
    lst[i] = placehold_swap 


import random 
def shuffle(lst): 
    for i in range (100): 
     choice1 = random.randint(0, len(lst)-1) 
     choice2 = random.randint(0, len(lst)-1) 
     swap(choice1, choice2 , lst) 

回答

3

swap函数什么都不做,因为你不lst交互的。您需要用lst[i]lst[j]替换您在作业中使用的ij值。随着改变你的洗牌应该工作(虽然你不需要placehold_shuffle因为swap不会返回任何东西)。

注意的是Python交换价值实际上可以更容易比大多数其他语言完成,得益于元组打包和拆包:

def swap(i, j, lst): 
    lst[i], lst[j] = lst[j], lst[i] 

不要担心得多,如果你不明白这一点还没有。只要您实际上更改列表元素,而不仅仅是变量ij,您当前的交换方法也可以正常工作。

0

您可以在Python中进行就地交换值,因此在交换时不需要保存首先覆盖的值。

def swap(x, y, li): 
    li[x], li[y] = li[y], li[x] 

从随机标准库中的一个方便的功能是选择。您可以选择从列表中选择随机索引,并使用基于列表长度的范围函数构建索引。假设你的列表是4个元素,那么范围(4)是一个包含元素(0,1,2,3)的序列。选择函数会为您选择一个函数,您可以直接将它作为参数传递给交换函数,并与列表一起确保它在范围内。

在Python中,您甚至可以通过将循环放入列表理解中进一步缩短代码。但这是可选的,在这种特殊情况下可能是一种优先选择。

def shuffle(li): 
    [swap(choice(range(len(li))), choice(range(len(li))), li) for i in range(100)]