以迭代和递归方式交换列表中的对 -Python3

DrJ*_*sop 1 python recursion list

我需要编写一个函数,给定一个输入列表,列表中的所有相邻元素都相互交换。如果列表的长度是奇数,则最后一个元素保持不变。我迭代地编写函数,如下所示:

>>>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]
Run Code Online (Sandbox Code Playgroud)

我对递归版本使用了与以前完全相同的逻辑:

def swap(nums, c=0):
    try:
        nums[c], nums[c+1] = nums[c+1], nums[c]
        return swap(nums, c+2)
    except:
        return nums
Run Code Online (Sandbox Code Playgroud)

虽然两者都有效,但我觉得我在使用这些try/except块时有点作弊,而且我不会一直使用它们而成为一个更好的程序员。有人可以就如何在不依赖try/except块的情况下解决这些问题给我建议吗?

Moh*_*ohd 5

对于迭代版本,您可以使用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
Run Code Online (Sandbox Code Playgroud)

在递归版本中,您可以检查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)
Run Code Online (Sandbox Code Playgroud)

这样你就可以避免,try/except因为你不会提高索引超出范围exception。并且作为参考,如果你想使用try/except它最好使用except IndexError:而不是通用的except:

输入:

print(swap([1, 2, 3, 4, 5, 6]))
print(swap([1, 2, 3, 4, 5]))
Run Code Online (Sandbox Code Playgroud)

输出:

[2, 1, 4, 3, 6, 5]
[2, 1, 4, 3, 5]
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@agtoever 提到的,您可以将递归版本修改为:

def swap(nums):
    if len(nums) < 2:
        return nums
    return [nums[1], nums[0]] + swap(nums[2:])
Run Code Online (Sandbox Code Playgroud)