如何使用列表头部切换索引处的节点?

时间:2014-08-04 17:58:01

标签: python python-2.7

我目前正在尝试创建一个函数,它将使用列表头部切换索引处的节点。因此,如果我的列表(列表)的值为[1, 7, 9, 12]且我致电switch(list, 2),则我的结果将为[9, 7, 1, 12]。这是我到目前为止的代码:

def switch(list, index):
    ....

def testSwitch():
#test code to ensure that switch() is working correctly.
myList = createList([10, 20, 30, 40, 50, 60])
print "The initial list", listString(myList)
myList = switch(myList, 2)
print "Switching the head and the 30.  Resulting list is ", listString(myList)
myList = switch(myList, 5)
print "Switching the head and the 60.  Resuling list is ", listString(myList)
myList = switch(myList, 29)  #should result in an error

2 个答案:

答案 0 :(得分:0)

切换列表中的元素实际上非常简单:

myList[0], myList[1] = myList[1], myList[0]

这将交换myList中的第一个和第二个元素。 Python实际上有一个优化的字节码命令,它可以非常快速地交换程序堆栈上的两个值,因此这与交换列表值的速度差不多。

当然,在这种情况下,你不会返回一个新列表,你将修改旧列表。因此,您只需编写myList = switch(myList, 2)而不是switch(myList, 2)。代码看起来像这样:

def switch(lst, i):
  lst[0], lst[i] = lst[i], lst[0]

如果您想要返回一个全新的列表,则需要先复制一份:

def switch(lst, i):
  newlst = list(lst)
  newlst[0], newlst[i] = newlst[i], newlst[0]
  return newlst

编辑:如果你正在使用链表,那就是一个不同的故事了。我认为链接列表不存在Python优化;常规列表很容易添加项目,并且它们适用于任何类型的对象,因此链接列表在Python中失去了它们的目的。不过,这是一个建议:

def switch(ll, i):
  head = ll
  currentItem = ll      # The head again
  prevItem = None       # The item that links to tempItem
  for x in range(i):    # Find the item to swap
    prevItem = currentItem
    currentItem = currentItem.next

  # Now we swap. We're rotating three items' .next values, so we can't
  # do the really optimized way.
  temp = currentItem.next
  currentItem.next = head.next
  head.next = prevItem.next
  prevItem.next = temp

链接列表操作是关于维护到下一个项目的正确链接。另请注意,如果您尝试交换链接列表中实际不存在的位置,则上述代码将失败。检查你的输入。

答案 1 :(得分:0)

您可以像切换两个变量一样进行:

def switch(x, ix):
    # x = x[:]
    x[0], x[ix] = x[ix], x[0]
    # return x

这将修改现有列表。如果要返回新列表,请取消注释注释行。