Как создать «строки», состоящие из пар, из списка объектов, которые сортируются на основе их атрибутов

#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)]