yarkov
@yarkov
https://github.com/yarkovaleksei/toster-extension

Как отсортировать кортеж?

Имеем кортеж с размерами картинок:
SIZES = ('1920x1080', '1600x1200', '1400x1050', '1280x1024', '1280x960', '1152x864', '1024x768',
             '3840x2400', '3840x2160', '3840x1200', '2560x1600', '2560x1440', '2560x1080', '2560x1024',
             '2048x1152', '1920x1200', '1680x1050', '1600x900', '1440x900', '1280x800', '1280x720', '2160x3840',
             '1440x2560', '1366x768', '1080x1920', '1024x600', '960x544', '800x1280', '800x600', '720x1280',
             '540x960', '480x854', '480x800', '400x480', '360x640', '320x480', '320x240', '240x400', '240x320',
             '2732x2732', '2048x2048', '1024x1024', '750x1334', '640x1136', '640x960', '1280x900')

Как составить функцию сортировки, чтобы получить кортеж, где размеры идут по возрастающей?
  • Вопрос задан
  • 374 просмотра
Решения вопроса 3
@deliro
Агрессивное программирование
Я сейчас скажу прописную истину, но она, оказывается, далеко не очевидна для питон-программистов.
Кортеж - это не "неизменяемый список". Кортеж - это структура данных. То, что кортеж умеет итерироваться - это хак, о котором даже сам Гвидо говорил.
Как минимум, существование таких штук, как __slots__ и namedtuple должно натолкнуть на эти размышления.

Касательно твоей задачи:
def cmp(x):
    x = x.split('x')
    return int(x[0]) * int(x[1])

sorted(SIZES, key=cmp)
Ответ написан
cronk
@cronk
Делаю графику для кино. Роботы, взрывы, пиу-пиу!
SIZES = ('1920x1080', '1600x1200', '1400x1050', '1280x1024', '1280x960', '1152x864', '1024x768',
             '3840x2400', '3840x2160', '3840x1200', '2560x1600', '2560x1440', '2560x1080', '2560x1024',
             '2048x1152', '1920x1200', '1680x1050', '1600x900', '1440x900', '1280x800', '1280x720', '2160x3840',
             '1440x2560', '1366x768', '1080x1920', '1024x600', '960x544', '800x1280', '800x600', '720x1280',
             '540x960', '480x854', '480x800', '400x480', '360x640', '320x480', '320x240', '240x400', '240x320',
             '2732x2732', '2048x2048', '1024x1024', '750x1334', '640x1136', '640x960', '1280x900')

dct = {int(size.split('x')[0]): size for size in SIZES}
dct_sorted = sorted(dct.items())

for size in dct_sorted:
    print(size[1])
Ответ написан
yarkov
@yarkov Автор вопроса
https://github.com/yarkovaleksei/toster-extension
И по традиции решение пришло тогда, когда задал вопрос )))
Решение:
SIZES = ('1920x1080', '1600x1200', '1400x1050', '1280x1024', '1280x960', '1152x864', '1024x768',
             '3840x2400', '3840x2160', '3840x1200', '2560x1600', '2560x1440', '2560x1080', '2560x1024',
             '2048x1152', '1920x1200', '1680x1050', '1600x900', '1440x900', '1280x800', '1280x720', '2160x3840',
             '1440x2560', '1366x768', '1080x1920', '1024x600', '960x544', '800x1280', '800x600', '720x1280',
             '540x960', '480x854', '480x800', '400x480', '360x640', '320x480', '320x240', '240x400', '240x320',
             '2732x2732', '2048x2048', '1024x1024', '750x1334', '640x1136', '640x960', '1280x900')

def str2tuple(arr):
    return sorted([(int(item.split('x')[0]), int(item.split('x')[1])) for item in arr])

def tuple2str(arr):
    return ["%dx%d" % (item[0], item[1]) for item in arr]

print tuple2str(str2tuple(SIZES))

Результат:
['240x320', '240x400', '320x240', '320x480', '360x640', '400x480', '480x800', '480x854', '540x960', '640x960', '640x1136', '720x1280', '750x1334', '800x600', '800x1280', '960x544', '1024x600', '1024x768', '1024x1024', '1080x1920', '1152x864', '1280x720', '1280x800', '1280x900', '1280x960', '1280x1024', '1366x768', '1400x1050', '1440x900', '1440x2560', '1600x900', '1600x1200', '1680x1050', '1920x1080', '1920x1200', '2048x1152', '2048x2048', '2160x3840', '2560x1024', '2560x1080', '2560x1440', '2560x1600', '2732x2732', '3840x1200', '3840x2160', '3840x2400']
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
OnederX Москва
от 100 000 до 120 000 ₽
NatsON Москва
от 220 000 до 350 000 ₽
SwapZilla.co Москва
от 200 000 ₽
15 авг. 2020, в 05:42
50000 руб./за проект
15 авг. 2020, в 05:23
5000 руб./за проект
15 авг. 2020, в 04:49
5000 руб./за проект