我目前正在尝试创建一个函数,它将使用列表头部切换索引处的节点。因此,如果我的列表(列表)的值为[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
答案 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
这将修改现有列表。如果要返回新列表,请取消注释注释行。