Как сортировать точки координат относительно у?

Нужно создать функцию, используя bubble sort, которая будет сортировать точки относительно координаты у.

Пример работы программы:

>>> p = [(4,1), (3,3), (2,0), (6,1), (3,2), (5,2), (1,1)]
>>> sort(p)
>>> print(p)
[(2, 0), (1, 1), (4, 1), (6, 1), (3, 2), (5, 2), (3, 3)]

Это пример кода, который у меня получился, но проблема в том, то он сортирует относительно х, а надо относительно у.

punktid = [(4,1), (3,3), (2,0), (6,1), (3,2), (5,2), (1,1)]
nums = punktid
def bubble_sort(nums): 
    # We set swapped to True so the loop looks runs at least once
    swapped = True
    while swapped:
        swapped = False
        for i in range(len(nums) - 1):
            if nums[i] > nums[i + 1]:
                # Swap the elements
                nums[i], nums[i + 1] = nums[i + 1], nums[i]
                # Set the flag to True so we'll loop again
                swapped = True
    return nums

Ответы (3 шт):

Автор решения: Zhihar

сортируйте так:

сортировка по y:

p = [(4,1), (3,3), (2,0), (6,1), (3,2), (5,2), (1,1)]
p.sort(key=lambda obj: obj[1])
print(p)

алгоритму просто показывается как именно надо сортировать (указывается вторая координата, а не первая)

вообще питон предполагает сортировку кортежей, поэтому можно делать более сложные сортировки

например, в данном примере сортировка идет по возрастанию координаты y, а когда координаты y одинаковые, то по убыванию координаты x:

p.sort(key=lambda obj: (obj[1], -obj[0]))

т.е. для сортировки питону передается кортеж координаты (y, -x), питон автоматически их выставляет по возрастанию, но поскольку второй параметр - отрицательный, то по координате x получается сортировка по убыванию

→ Ссылка
Автор решения: CrazyElf

Если вам всё же нужна именно ваша сортировка, а не встроенная, то можно сделать так - просто переворачивать кортежи при сравнении:

def swap(x):
    return (x[1], x[0])

def bubble_sort(nums): 
    # We set swapped to True so the loop looks runs at least once
    swapped = True
    while swapped:
        swapped = False
        for i in range(len(nums) - 1):
            if swap(nums[i]) > swap(nums[i + 1]):
                # Swap the elements
                nums[i], nums[i + 1] = nums[i + 1], nums[i]
                # Set the flag to True so we'll loop again
                swapped = True
    return nums

nums = [(4,1), (3,3), (2,0), (6,1), (3,2), (5,2), (1,1)]
print(bubble_sort(nums))

Вывод:

[(2, 0), (1, 1), (4, 1), (6, 1), (3, 2), (5, 2), (3, 3)]
→ Ссылка
Автор решения: SergFSM

если заменить в вашем коде это условие:

if nums[i] > nums[i + 1]

на такое:

if nums[i][1] > nums[i + 1][1] or nums[i][1] == nums[i + 1][1] and nums[i] > nums[i+1]

то ваш код даст нужный результат:

[(2, 0), (1, 1), (4, 1), (6, 1), (3, 2), (5, 2), (3, 3)]
→ Ссылка