我需要编写一个给定输入列表的函数,该列表中的所有相邻元素都相互交换。如果列表的长度为奇数,则最后一个元素保持不变。我迭代地编写了函数,如下所示:
>>>def swap(nums):
for i in range(0,len(nums),2):
try:
nums[i],nums[i+1] = nums[i+1], nums[i]
except:
pass
return nums
>>>swap([1,2,3,4,5])
[2, 1, 4, 3, 5]
对于递归版本,我使用了与以前完全相同的逻辑:
def swap(nums, c=0):
try:
nums[c], nums[c+1] = nums[c+1], nums[c]
return swap(nums, c+2)
except:
return nums
尽管两者都能工作,但我感觉我对这些
try/except
块有点作弊,而且我不会一直使用它们成为更好的程序员。有人可以在不依赖try/except
块的情况下给我建议如何解决这些问题吗? 最佳答案
对于迭代版本,可以使用range(0, len(nums)-1, 2)
不断循环直到最后一个项目如下:
def swap(nums):
for i in range(0, len(nums) - 1, 2):
nums[i], nums[i + 1] = nums[i + 1], nums[i]
return nums
在递归版本中,您可以检查
if c >= len(nums) - 1
以检查是否已到达最后一项:def swap(nums, c=0):
if c >= len(nums) - 1:
return nums
nums[c], nums[c+1] = nums[c+1], nums[c]
return swap(nums, c+2)
这样,您可以避免
try/except
,因为您不会将索引提高到exception
范围之外。作为参考,如果要使用try/except
,最好使用except IndexError:
而不是常规的except:
。输入:
print(swap([1, 2, 3, 4, 5, 6]))
print(swap([1, 2, 3, 4, 5]))
输出:
[2, 1, 4, 3, 6, 5]
[2, 1, 4, 3, 5]
编辑:
如@agtoever所述,您可以将递归版本修改为:
def swap(nums):
if len(nums) < 2:
return nums
return [nums[1], nums[0]] + swap(nums[2:])