"""
Group all elements from even indices together and all elements from odd indices together.
For example, given [1, 12, 23, 34, 55], return [1, 23, 55, 12, 34].
Additionally: perform the task using different methods, including list comprehensions.
"""

"""
(a) Using a while loop to group even and odd index elements
"""

l = [1, 12, 23, 34, 55]
l_even_index_first = []

# Collect all elements at even indices (0, 2, 4, ...)
i = 0
while i < len(l):
    l_even_index_first.append(l[i])
    i += 2

# Collect all elements at odd indices (1, 3, 5, ...)
i = 1
while i < len(l):
    l_even_index_first.append(l[i])
    i += 2

# Output the reordered list
print(f"l_even_index_first = {l_even_index_first}")

"""
(b) Using a for loop with enumerate to group elements
"""

l = [1, 12, 23, 34, 55]
l_even_index_first = []

# First, collect all elements at even indices
for i, x in enumerate(l):
    if i % 2 == 0:  # Check if index is even
        l_even_index_first.append(x)

# Then, collect all elements at odd indices
for i, x in enumerate(l):
    if i % 2 == 1:  # Check if index is odd
        l_even_index_first.append(x)

# Output the reordered list
print(f"l_even_index_first = {l_even_index_first}")

"""
(c) Using list comprehensions to achieve the same result
"""

l = [1, 12, 23, 34, 55]
l_even_index_first = []

# Create a list for even-indexed elements and a list for odd-indexed elements using list comprehensions
even = [x for i, x in enumerate(l) if i % 2 == 0]
odd = [x for i, x in enumerate(l) if i % 2 == 1]

# Combine the even-indexed elements followed by odd-indexed elements
even.extend(odd)
l_even_index_first = even

# Output the reordered list
print(f"l_even_index_first = {l_even_index_first}")


"""
Yet another alternative solution: using slicing to group even and odd index elements
"""

l = [1, 12, 23, 34, 55]
l_even_index_first = []

# Using slicing to group elements at even indices and odd indices
# l[::2] selects elements at even indices, l[1::2] selects elements at odd indices
l_even_index_first = l[::2] + l[1::2]

# Output the reordered list
print(f"l_even_index_first = {l_even_index_first}")
