交替合并不相等的两个列表
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)))
我的目标是写下一个调用 所有偶数索引将在列表中以降序排列的最大数字,而奇数索引将以升序排列的最小数字顺序.
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)))