Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从头开始交换和洗牌_Python_Python 3.x - Fatal编程技术网

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)]