如何交换Python列表中的项目?

时间:2015-01-06 17:33:16

标签: python python-2.7

问题是编写python代码来生成数字{1,2,3,...,n}的所有排列。所以,我写这段代码:

def permute(n):

  if n==len(a):
    print a
    return

  for i in range(n,len(a)):
    swap(i,n)
    permute(n+1)
    swap(i,n)


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

a=[1,2,3,4]       #any list 
permute(0)

它完美无缺。但是由于我所拥有的空闲时间,我修改了一下并编写了这段代码:

def permute(n):

  if n==len(a):
    print a
    return

  for i in range(n,len(a)):
    swap(a[i],a[n])           #modification
    permute(n+1)
    swap(a[i],a[n])           #modification


def swap(x,y):
  x,y=y,x                     #modification

a=[1,2,3,4]
permute(0)

这一次没用。但在那之后,我读了一些关于如何在python中为值分配变量的方法。

但是我仍然想知道,根据你的说法,第二个代码是错的,这样我就可以反复核对并讨论我认为出了什么问题!这是我的第一个问题。

我的第二个问题是如何在python列表中进行值的交换?它与简单值会发生什么不同?因为上面的代码似乎都适用。但我无法弄明白这一点我可以让自己理解,而且它进一步让我感到困惑,那就是python如何操纵它的列表。

我确信在Python语言的设计中有一些我不知道导致所有这些混淆的东西。帮助我解决它们,如果可能的话,使用一些图片可视化。那么我很容易理解发生了什么!

3 个答案:

答案 0 :(得分:10)

第一个问题:

这就是原因:

def swap(x,y):
    x, y = y, x

这只是交换了本地名称。 x将等于y,反之亦然,但仅限于该函数内部。在该函数之外(全局范围),什么都不会改变。


第二个问题(你应该避免在一个问题中提出多个问题):

假设:

x = a[i]
y = a[n]

要交换列表中的值,您必须设置它们:

a[n] = x
a[i] = y

与...相同:

a[i], a[n] = y, x

y = a[n]x = a[i]以来,它与:

相同
a[i], a[n] = a[n], a[i]

答案 1 :(得分:1)

swap函数正在交换局部变量xy而不是全局数组。

def swap(x,y):
  x,y=y,x 

这是完全错误的

您可以改为执行以下操作

  • 将功能体更改为

    return y,x 并将该函数称为a[n],a[i] = swap(a[i],a[n])

  • 或直接交换就地a[n],a[i] = a[i],a[n]

  • 或者像之前那样做

答案 2 :(得分:0)

如果列表仅由数字组成:

A[i] = A[i] + A[n]
A[n] = A[i] - A[n]
A[i] = A[i] - A[n]