Как сортировать точки координат относительно у?
Нужно создать функцию, используя 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 шт):
сортируйте так:
сортировка по 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 получается сортировка по убыванию
Если вам всё же нужна именно ваша сортировка, а не встроенная, то можно сделать так - просто переворачивать кортежи при сравнении:
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)]
если заменить в вашем коде это условие:
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)]