交替合并不相等的两个列表

Merging Unequal two lists alternatively

我的目标是写下一个调用 所有偶数索引将在列表中以降序排列的最大数字,而奇数索引将以升序排列的最小数字顺序.

For example:

input: arr = [1,2,3,4,5]
output: arr = [5,1,4,2,3]

input: arr = [1,2,3,4,5,6,7]
output: arr = [7,1,6,2,5,3,4]

我将原始数组拆分为两个不同的数组。一个用于偶数索引,另一个用于奇数索引。然后我用偶数索引数字反转数组。 我的问题是交替合并两个不相等的列表。

# This is my python code

def max_min_naive(lst):
    even_lst = []
    odd_lst = []

    for i in range(len(lst)):
        if i%2 == 0:
            even_lst.append(lst[i])
        else:
            odd_lst.append(lst[i])
    #print(even_lst, odd_lst)
    even_lst.reverse()
    #print(even_lst, odd_lst)

    even_pointer = 0
    odd_pointer = 0
    res = []

    #print(len(even_lst), len(odd_lst))

    #This part is wrong. need help

    while len(res) <= len(lst):
        if even_pointer < len(even_lst):
            res.append(even_lst[even_pointer])
            even_pointer += 1
        else:
            break
        if odd_pointer < len(odd_lst):
            res.append(odd_lst[odd_pointer])
            odd_pointer += 1
        else:
            break
    #print(res)
    return res

if __name__ == '__main__':
    lst = [1,2,3,4,5]
    lst_1 = [1,2,3,4,5,6,7]
    print(max_min_naive(lst))
    print(max_min_naive(lst_1))

I get [7,2,5,4,3,6,1] instead of [7,1,6,2,5,3,4]

升序和降序先分离再合并的方案

from itertools import chain, zip_longest

for arr in [
    [1,2,3,4,5], # 5 1 4 2 3
    [1,2,3,4,5,6], # 6 1 5 2 4 3
]:
    if len(arr) <= 1:
        print(arr)
        continue

    to_move_count = len(arr) // 2
    
    descending = list(reversed(arr[-to_move_count:]))
    ascending = arr[:len(arr) - to_move_count]
    
    merged = chain.from_iterable(zip_longest(descending, ascending))
    merged = list(filter(lambda value: value is not None, merged))
    print(merged)
[5, 1, 4, 2, 3]
[6, 1, 5, 2, 4, 3]

看看这是否有帮助:

与其将其拆分为 2 个数组,不如使用以下简单的解决方案:

a=[1,2,3,4,5,6,7]
b=[]
for i in range(int(len(a)/2)):
    b.append(a[-1*(i+1)])
    b.append(a[i])
if(len(a)%2!=0):
    b.append(a[i+1])    
b

我会把它分开一些。首先我们知道我们想要一个排序数组,所以让我们这样做:

arr = sorted(arr)

然后我们可以将列表分成高数和低数:

lower = arr[:len(arr) // 2]
upper = arr[len(arr) // 2:]

现在我们要填充合并列表。当还有剩余的物品时,从末尾弹出较高的,从开头弹出较低的:

merged = []
while lower or upper:
    if upper:
        merged.append(upper.pop())
    if lower:
        merged.append(lower.pop(0))

您将在 merged 中得到想要的结果。

双线:

arr = sorted(arr, reverse=True)
arr = [arr[-(i // 2 + 1)] if i % 2 else arr[i // 2] for i in range(len(arr))]

基本上,给定一个已排序的数组,您希望按以下方式对其重新排序: 0 -> 0; 1 -> -1; 2 -> 1; 3 -> -2; 4 -> 2; 5 -> -3

所以偶数索引得到 arr[i // 2],奇数索引得到 arr[-(i // 2 + 1)]

使用一些奇特的辅助方法

from itertools import chain, islice
...

arr = sorted(arr)
arr = list(islice(chain.from_iterable(zip(reversed(arr), arr)), len(arr)))