Python 从头开始交换和洗牌
我在这里查看了一些线程,但我还不能完全消化它,也不能使代码正常工作。 这很简单,但我在这方面遇到了很多问题,因此: 我有一张单子Python 从头开始交换和洗牌,python,python-3.x,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 = ["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)
我不允许有返回lst或任何类型的返回,所以我认为应该有列表=[某物]循环内部或外部的某个地方,因此,一旦某个内容被洗牌,它会将其保存为更新的列表,然后在循环内部再次洗牌,但我不确定如何执行该操作,因为我无法让我的第一个功能正常工作,所以我还没有玩过它
跟进*
我的两个函数是这样工作的:
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)
您的
swap
函数没有任何作用,因为您根本没有与lst
交互。您需要将分配中使用的i
和j
值替换为lst[i]
和lst[j]
。有了这个改变,你的洗牌应该可以工作了(尽管你不需要placehold\u shuffle
,因为swap
不会返回任何东西)
请注意,由于元组打包和解包,在Python中交换值实际上比在大多数其他语言中更容易:
def swap(i, j, lst):
lst[i], lst[j] = lst[j], lst[i]
如果你还不明白这一点,不要太担心。只要您实际更改列表的元素,而不仅仅是变量
i
和j
您的swap
函数没有任何作用,因为您根本没有与lst
进行交互。您需要将分配中使用的i
和j
值替换为lst[i]
和lst[j]
。有了这个改变,你的洗牌应该可以工作了(尽管你不需要placehold\u shuffle
,因为swap
不会返回任何东西)
请注意,由于元组打包和解包,在Python中交换值实际上比在大多数其他语言中更容易:
def swap(i, j, lst):
lst[i], lst[j] = lst[j], lst[i]
如果你还不明白这一点,不要太担心。只要您实际更改列表的元素,而不仅仅是变量
i
和j
,,当前的交换方法也可以很好地工作,您可以在Python中进行值的就地交换,因此在交换时不必先保存要覆盖的值
def swap(x, y, li):
li[x], li[y] = li[y], li[x]
随机标准库中的一个方便函数是choice。您可以让choice从包含所有索引的列表中选择一个随机索引,该索引可以使用基于列表长度的范围函数构造
from random import choice
def shuffle(li):
for i in range(100):
swap(choice(range(len(li))), choice(range(len(li))), li)
假设您的列表有4个元素,那么范围(4)是一个包含元素(0、1、2、3)的序列。choice函数为您选择一个,您可以直接将其作为参数传递给swap函数,并将其与列表一起传递,以确保它在范围内
在Python中,甚至可以通过将循环放入列表中来进一步缩短代码。但这是可选的,在这种特殊情况下,这可能是一种偏好选择
def shuffle(li):
[swap(choice(range(len(li))), choice(range(len(li))), li) for i in range(100)]
您可以在Python中进行值的就地交换,因此在交换时不需要先保存要覆盖的值
def swap(x, y, li):
li[x], li[y] = li[y], li[x]
随机标准库中的一个方便函数是choice。您可以让choice从包含所有索引的列表中选择一个随机索引,该索引可以使用基于列表长度的范围函数构造
from random import choice
def shuffle(li):
for i in range(100):
swap(choice(range(len(li))), choice(range(len(li))), li)
假设您的列表有4个元素,那么范围(4)是一个包含元素(0、1、2、3)的序列。choice函数为您选择一个,您可以直接将其作为参数传递给swap函数,并将其与列表一起传递,以确保它在范围内
在Python中,甚至可以通过将循环放入列表中来进一步缩短代码。但这是可选的,在这种特殊情况下,这可能是一种偏好选择
def shuffle(li):
[swap(choice(range(len(li))), choice(range(len(li))), li) for i in range(100)]