Как отсортировать коллекцию на основе другой коллекции в Python?

Я очень плохо знаком с Python и мне нужна помощь в решении следующей проблемы. Это определение, которое я опубликовал ниже, примет набор кортежей, представляющих прямоугольники Ex. (ширина высота).

В этом методе я сначала сортирую коллекцию прямоугольников таким образом, чтобы элементы с наибольшей шириной находились в начале списка, затем я использую эту коллекцию позже, чтобы назначить координаты UPPER_LEFT_X и UPPER_LEFT_Y для каждого прямоугольника.

Мой вопрос: как мне взять эту коллекцию координат и отсортировать ее так, чтобы она была в том же порядке, что и исходная_прямая_коллекция? Способ работы драйвера заключается в том, что определенные координаты должны быть заданы в том же порядке, что и исходная коллекция прямоугольников. Спасибо! Дайте мне знать, если требуется больше объяснений.

def find_best_coordinates(rectangles):
    placement = []
    upper_left_x = 0
    upper_left_y = 0
    loop_count = 0

    original_rectangle_collection = rectangles
    #sort the rectangles according to width.
    rectangles.sort(key=operator.itemgetter(0))
    #reverse the list so the tallest rectanlgle is placed first
    rectangles.reverse()


    #set the max width to the tallest rectangle's width
    max_width = rectangles[0][0]
    #print("Max width",max_width)

    #loop through and place the rectangles
    for rectangle in rectangles:
        if loop_count == 0:
            max_width = rectangle[0]
        height = rectangle[1]
        coordinate = (upper_left_x, upper_left_y)  
        placement.insert(0, coordinate)             
        upper_left_y = upper_left_y - height - 990
        loop_count = loop_count + 1
        if loop_count == 50:
            upper_left_x = upper_left_x + max_width + 990
           # print("x = ", upper_left_x)
            loop_count = 0
            #print("y = ", upper_left_y)
            upper_left_y = 0

    #reverse the list before it gets returned
    placement.reverse()                            
    return placement

2 ответа

Решение

Вы можете сделать это таким образом, всегда передавая исходный индекс вместе с прямоугольником и сохраняя его с сгенерированной координатой.

# Store indexes
rdicts = [{'index': i, 'rectangle': r} for i, r in enumerate(rectangles)]
# Sort by width
rdicts.sort(key=lambda d: d['rectangle'][0], reverse=True)

placement = []
for rdict in rdicts:
    rectangle = rdict['rectangle']
    ... # do the rest of your algorithm
    # Add the calculated coordinate, along with the original index
    placement.append({'index': rdict['index'], 'coordinate': coordinate})

# Sort by the original index
placement.sort(key=lambda p: p['index'])
# Return the coordinates without the indexes.
ordered_placement = [p['coordinate'] for p in placement]

Вы можете пойти немного быстрее, просто отсортировав индексы:

processing_order = sorted(
    range(len(rectangles)), 
    key=lambda i: rectangles[i][0]
)

for rect_i in processing_order:
    r = rectangles[rect_i]
    # ... blah blah with r as current rectangle

# Done processing, output them in original order:
for r in rectangles:
    # Still in order!
Другие вопросы по тегам