#python #list #numpy #sorting #arraylist
Вопрос:
У меня есть список из n чисел. Я хочу сгруппировать их в группы g. Кроме того, я хочу поменять местами элементы в каждой нечетной группе. Наконец, я бы объединил все элементы в четные и нечетные группы в новый подсписок. Сначала я даю тот ответ, которого ожидаю, и где я ошибся:
Ожидаемый ответ:
num = 14
grp = 4
# A list of num natural numbers arranged in group (row) of 4 numbers
lst =
[0,1,2,3,
4,5,6,7,
8,9,10,11,
12,13]
lst =
[[0,1,2,3],
[4,5,6,7],
[8,9,10,11],
[12,13]]
# Reverse elements in odd rows
newlst =
[[0,1,2,3],
[7,6,5,4], # reversed here
[8,9,10,11],
[13,12]] # reversed here
# combine elements in all sublists by their position
# combine first element in all sublists into a new sublist
sollst =
[[0,7,8,13],[1,6,9,12],[2,5,10],[3,4,11]]
Мое решение:
num = 14
grp = 4
#### print
lst= list(range(0,num,1))
newlst= [lst[i:i grp:1] for i in range(0,num,grp)]
evnlst = newlst[0::2]
oddlst = newlst[1::2]
newoddlst = [oddlst [i][::-1] for i in range(len(oddlst))]
sollst= evnlst newoddlst
# This gives [[0, 1, 2, 3], [8, 9, 10, 11], [7, 6, 5, 4], [13, 12]]
from itertools import zip_longest
print([[x for x in t if x is not None] for t in zip_longest(fevngps)])
Настоящий ответ:
Я сделал один шаг до окончательного ответа, и теперь мне нужно объединить списки разной длины, и я сталкиваюсь с ошибкой
TypeError: 'int' object is not subscriptable
Ответ №1:
Один подход:
from itertools import zip_longest
num = 14
grp = 4
lst = list(range(0, num, 1))
newlst = [lst[i:i grp:1] for i in range(0, num, grp)]
# build new list where the sub-list are reversed if in odd indices
revlst = [lst[::-1] if i % 2 == 1 else lst for i, lst in enumerate(newlst)]
# zip using zip_longest and filter out the None values (the default fill value of zip_longest)
result = [[v for v in vs if v is not None] for vs in zip_longest(*revlst)]
print(result)
Выход
[[0, 7, 8, 13], [1, 6, 9, 12], [2, 5, 10], [3, 4, 11]]
Комментарии:
1. Ваше решение на высоте. Черт! Я знал, что мое решение длинное, и я делаю обходные пути, но существует простой способ сделать это. Ваше решение классное.