我在这里查看了几个主题,因为我无法完全消化它或使我的代码正常工作。 这很简单,但我遇到了很多问题,所以这就是:
我有一个清单
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)
答案 0 :(得分:3)
您的swap
功能无效,因为您根本没有与lst
进行互动。您需要在i
和j
的作业中替换您正在使用的lst[i]
和lst[j]
值。通过这种更改,您的随机播放应该有效(尽管您不需要placehold_shuffle
,因为swap
不会返回任何内容。)
请注意,在Python中交换值实际上可以比大多数其他语言更容易完成,这要归功于元组打包和解包:
def swap(i, j, lst):
lst[i], lst[j] = lst[j], lst[i]
如果你还没有理解这一点,请不要担心。只要您实际更改列表中的元素,而不仅仅是变量i
和j
,您当前的交换方法也可以正常工作。
答案 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)]