从头开始交换和改组

时间:2017-02-28 19:05:12

标签: python python-3.x

我在这里查看了几个主题,因为我无法完全消化它或使我的代码正常工作。 这很简单,但我遇到了很多问题,所以这就是:

我有一个清单

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

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

编辑我不允许在Python中使用就地交换

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

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

    lst = lst

显然这不起作用。我的第一直觉是做

    return lst

但在作业中我不允许使用return或print,我只允许修改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)

我不允许返回或任何类型的返回,所以我认为我应该在循环内部或外部的某处有 list = [something] 一旦有什么东西被洗牌,它将它保存为更新的列表,然后在循环内再次洗牌,但我不知道该怎么做,因为我无法获得我的第一个功能,所以我没有去玩它工作。

跟进*

我的两个功能是这样的:

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)

2 个答案:

答案 0 :(得分:3)

您的swap功能无效,因为您根本没有与lst进行互动。您需要在ij的作业中替换您正在使用的lst[i]lst[j]值。通过这种更改,您的随机播放应该有效(尽管您不需要placehold_shuffle,因为swap不会返回任何内容。)

请注意,在Python中交换值实际上可以比大多数其他语言更容易完成,这要归功于元组打包和解包:

def swap(i, j, lst):
    lst[i], lst[j] = lst[j], lst[i]
如果你还没有理解这一点,请不要担心。只要您实际更改列表中的元素,而不仅仅是变量ij,您当前的交换方法也可以正常工作。

答案 1 :(得分:0)

您可以在Python中进行值的内部交换,因此您无需在交换时保存首先覆盖的值。

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

随机标准库中的一个方便的功能是选择。您可以让选择从包含所有索引的列表中选择随机索引,可以使用基于列表长度的范围函数来构造索引。

from random import choice

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

假设您的列表长度为4个元素,则range(4)是具有元素(0,1,2,3)的序列。选择函数为您选择一个,您可以直接将其作为参数传递给您的交换函数,以及您的列表以确保它在范围内。

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

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