【问题标题】:how to do mutation in python? by reordering the original list如何在python中进行突变?通过重新排序原始列表
【发布时间】:2013-11-06 05:08:30
【问题描述】:
def swap_numbers(x, x_index): 
    for num in x:
        if x_index < len(x)-1:
            x[:] = x[:x_index] + [x[x_index+1]] + [x[x_index]]+ x[x_index+2:]
        elif x_index == len(x)-1:
            x[:] = [x[-1]] + x[1:-1] + [x[0]]

所以如果我想改变一个列表,可以说 x = [1,2,3,4,5] 和 x_index = 2 这个函数所做的是将我们输入的索引的数字与后面的数字交换。

应该是这样的

>>> x = [1,2,3,4,5]
>>> swap_numbers(x,2)
>>> x
[1,2,4,3,5]

但我的是

>>> x = [1,2,3,4,5]
>>> swap_numbers(x,2)
>>> x
[1,2,3,4,5]

但是,如果我制作函数的第一部分,它会起作用

x[:] = [x[:x_index] + [x[x_index+1]] + [x[x_index]] + x[x_index+2:]]"

它会变成

>>> x = [1,2,3,4,5]
>>> swap_numbers(x,2)
>>> x
[[1,2,4,3,5]]

我该怎么办?

【问题讨论】:

  • numnum_list 是什么?那些应该是xx_index
  • 呃...opps,谢谢你告诉我,已经切换了:P
  • 你为什么使用循环for num in x:
  • @njzk2 哈哈,没关系,我以为我需要它,我是 python 的初学者,所以....哈哈,这是一个愚蠢的错误
  • 你原来的 cdde 会工作,我想,如果你只是删除 for 行......

标签: python mutation


【解决方案1】:

可能是这样的:

def swap (l, i):
    l [i], l [i + 1] = l [i + 1], l [i]

这会产生:

>>> def swap (l, i): l [i], l [i + 1] = l [i + 1], l [i]
... 
>>> a = [1, 2, 3, 4, 5]
>>> swap (a, 2)
>>> a
[1, 2, 4, 3, 5]

【讨论】:

  • 唯一的问题是如果 i = len(l) - 1,因为 l[i+1] 会抛出异常
  • 但如果是 'swap_numbers(x,4)',x 会变成 [5,2,3,4,1] 吗?
  • 我想使用(i + 1) % len(l) 应该可以解决它
  • def swap (l, i): l [i], l [(i + 1) % len(l)] = l [(i + 1) % len(l)], l [i]
  • 那个也可以:def swap (l, i): l [i], l [i + 1 - len(l)] = l [i + 1 - len(l)], l [i]
【解决方案2】:

这取决于您想对索引错误(交换不存在)做什么,但这有效:

x = [1,2,3,4,5]
def swap_numbers(li, ind):
    try:
        li[ind],li[ind+1]=li[ind+1],li[ind]
    except IndexError:
        pass       

swap_numbers(x,2)
print x   
# [1, 2, 4, 3, 5]

这不会做任何不能做的事情,比如swap_numbers(x,5)

【讨论】:

  • 但如果是 'swap_numbers(x,4)',x 会变成 [5,2,3,4,1] 吗?
  • 没有。如果你这样做swap_numbers(x,4) x 不会改变
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多