Как отсортировать коллекцию на основе другой коллекции в 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!