5 Best Ways to Swap Consecutive Index Pairs in Python Arrays

πŸ’‘ Problem Formulation: Given an array (list) in Python, the task is to swap every pair of consecutive indices. For an array with an even number of elements, this will be a complete swap, while for an array with an odd number of elements, the last element will remain in place. For example, given the input [1, 2, 3, 4, 5], the desired output after swapping would be [2, 1, 4, 3, 5].

Method 1: Using a For Loop and Tuple Unpacking

This method entails iterating over the list elements in steps of 2 and swapping the elements using tuple unpacking, which is a straightforward, readable approach in Python.

Here’s an example:

def swap_pairs(arr):
    for i in range(0, len(arr)-1, 2):
        arr[i], arr[i+1] = arr[i+1], arr[i]
    return arr

print(swap_pairs([1, 2, 3, 4, 5]))

The output is: [2, 1, 4, 3, 5]

This snippet defines a function swap_pairs() that accepts an array and returns it after swapping consecutive pairs. The for loop uses a step of 2 to swap elements pairwise except the last one if the array length is odd.

Method 2: Using Slicing

Slicing can be used to create a more Pythonic and one-liner solution by iterating over pairs and reconstructing the array.

Here’s an example:

def swap_pairs(arr):
    return arr[1::2] + arr[::2] if len(arr) % 2 == 0 else arr[1::2] + [arr[-1]] + arr[::2]

print(swap_pairs([1, 2, 3, 4, 5]))

The output is: [2, 1, 4, 3, 5]

The function swap_pairs() takes the even-indexed elements by slicing and combines them with the odd-indexed elements, effectively creating the swap. It handles an odd-numbered list by appending the last element as is.

Method 3: Using List Comprehension

List comprehensions in Python offer a succinct way to create lists. You can use a list comprehension to swap pairs in an array with a conditional to manage odd-length lists.

Here’s an example:

def swap_pairs(arr):
    return [arr[i+1] if i % 2 == 0 else arr[i-1] for i in range(len(arr))]

print(swap_pairs([1, 2, 3, 4, 5]))

The output is: [2, 1, 4, 3, 5]

This code snippet demonstrates a swap_pairs() function using list comprehension to swap pairs in the array. It alternates between picking the next or previous element based on the current index’s even or odd status.

Method 4: Using the zip Function

The zip function can couple the elements of two lists, and you can use it to swap the elements when you pair the odd-indexed elements with even-indexed ones.

Here’s an example:

def swap_pairs(arr):
    arr[::2], arr[1::2] = arr[1::2], arr[::2]
    return arr

print(swap_pairs([1, 2, 3, 4, 5]))

The output is: [2, 1, 4, 3, 5]

The function swap_pairs() performs the swap by assigning the sliced arrays to each other. Using zip() directly would need unpacking into a new list, but this approach modifies the original list in place.

Bonus One-Liner Method 5: Using List Comprehension with Slicing

If you’re a fan of one-liners, Python permits even a complicated task like this to be condensed into a single line with list comprehension and slicing.

Here’s an example:

arr = [1, 2, 3, 4, 5]
arr[::2], arr[1::2] = arr[1::2], arr[::2]
print(arr)

The output is: [2, 1, 4, 3, 5]

This is a concise version of Method 4 that performs the swap in-place. It reassigns slices of the original array to accomplish the swap with a single line of code.

Summary/Discussion

  • Method 1: For Loop and Tuple Unpacking. Simple and readable. However, it may be slower for large lists due to the loop overhead.
  • Method 2: Using Slicing. Pythonic and concise. Less readable for those unfamiliar with Python slicing and can be slightly less efficient due to list concatenation.
  • Method 3: List Comprehension. Compact and Pythonic. It can be cryptic for newcomers and is not as efficient as in-place solutions.
  • Method 4: Zip Function. Efficient in-place solution. It can be less intuitive to those not familiar with slicing and list manipulation in Python.
  • Method 5: Bonus One-Liner. Highly concise. The clarity of the code might suffer, and it depends on an even number of elements in the list for a full swap.