#python #loops #sorting #rows
#python #циклы #сортировка #строки
Вопрос:
Я создал класс с атрибутами и отсортировал их по уровню x, начиная с 1-6. Затем я хочу отсортировать список по парам, где объекты с наивысшим уровнем «x» и объект с наименьшим уровнем «x» соединяются вместе, а второй самый и второй меньше и так далее. Если бы это было по-моему, это выглядело бы так, даже несмотря на то, что объекты не являются итеративными.
for objects in sortedlist:
i = 0
row(i) = [[sortedlist[i], list[-(i)-1]]
i = 1
if i => len(sortedlist)
break
Комментарии:
1. Что произойдет, если список содержит нечетное количество элементов?
2. Можете ли вы показать нам свои входные данные и ожидать выходных данных?
Ответ №1:
Используя zip
Я думаю, что нужный вам код:
rows = list(zip(sortedList, reversed(sortedList)))
Однако обратите внимание, что это «дублировало бы» элементы:
>>> sortedList = [1, 2, 3, 4, 5]
>>> list(zip(sortedList, reversed(sortedList)))
[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]
Если вы знаете, что в списке четное количество элементов, и хотите избежать дубликатов, вы можете вместо этого написать:
rows = list(zip(sortedList[:len(sortedList)//2], reversed(sortedList[len(sortedList)//2:])))
Со следующим результатом:
>>> sortedList = [1,2,3,4,5,6]
>>> list(zip(sortedList[:len(sortedList)//2], reversed(sortedList[len(sortedList)//2:])))
[(1, 6), (2, 5), (3, 4)]
Использование циклов
Хотя я рекомендую использовать zip
вместо a for
-loop, вот как исправить цикл, который вы написали:
rows = []
for i in range(len(sortedList)):
rows.append((sortedList[i], sortedList[-i-1]))
С результатом:
>>> sortedList=[1,2,3,4,5]
>>> rows = []
>>> for i in range(len(sortedList)):
... rows.append((sortedList[i], sortedList[-i-1]))
...
>>> rows
[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]