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

时间:2017-08-15 16:35:56

标签: python list recursion

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

>>>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块的情况下解决这些问题的建议吗?

3 个答案:

答案 0 :(得分:4)

对于迭代版本,您可以使用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:])

答案 1 :(得分:0)

<强>迭代:

for i in range(0, len(nums) - (len(nums) % 2), 2): #Skips the last element in an odd length list
  nums[c], nums[c+1] = nums[c + 1], nums[c]

<强>递归:

import math

def swap(nums):
  if len(nums) == 2:
    return [nums[1], nums[0]]
  if len(nums) == 1:
    return nums[0]
  half = int(math.ceil(len(nums) / 2.0))
  return swap(nums[:half]) + swap(nums[half:])

答案 2 :(得分:0)

def swap(li):
  if len(li) < 2:
    return li
  else:
    return [li[1], li[0]] + swap(li[2:])

def swap(li):
  def swap_iter(inlist, out):
    if len(inlist) < 2:
      return out + inlist
    else:
      return swap_iter(inlist[2:], out + [inlist[1], inlist[0]])
  return swap_iter(li, [])