как отсортировать список в python, состоящий из разрешений мониторов?

#python #list #sorting

Вопрос:

Я хочу отсортировать этот список, но не смог найти способ сделать это.

ввод/вывод :

 ['1152x864', '1920x1080', '1600x900', '1280x1024', '1024x768', '640x480', '720x400', '800x600']
 

o/p :

 ['1920x1080', '1600x900', '1280x1024', '1152x864', '1024x768', '800x600', '720x400', '640x480']
 

Заранее спасибо.

Комментарии:

1. Что ты пробовал?

2. Отсортируйте их по какому именно критерию? Общее количество пикселей?

3. Это, по-видимому width*height , продукты. По чему вы хотите отсортировать список? По ширине? По росту? На поверхности width*height ? По соотношению?

4. Это не одно и то же: «1440×1080» — это более высокое разрешение, чем «1600×900», которое было бы выше, если бы вы шли только по ширине.

5. @Aravindh, основываясь на ваших комментариях, у вас есть 2 подходящих варианта. либо размер экрана, либо общее количество пикселей. Как пояснил Гризмар выше, использование только ширины было бы довольно неоднозначным.

Ответ №1:

TLDR;

Мой последний подход, по-видимому, наиболее релевантен для вашего случая. Когда вы видите устройство с надписью «14-дюймовый экран», они говорят о диагонали, а не о высоте или ширине. Итак, если вы хотите сказать, что MacBook 15 > MacBook 13, то это то, что нужно. Если вы просто хотите работать с разрешением и пикселями, попробуйте предпоследний вариант, который был бы более уместен.


Вы можете использовать sorted() вместе с пользовательским ключом функцию lambda для извлечения высоты, ширины и применения ваших вычислений. Вам также понадобится reverse=True , основываясь на том, что вы пытаетесь сделать.

Лямбда-функция принимает каждый элемент как x , а затем извлекает ширину и/или высоту, используя x.split('x')[0] и x.split('x')[1] соответственно. Затем вы можете использовать теорему Пифагора, чтобы получить диагональ, или просто сложить их, чтобы получить ваши пиксели и т. Д..

Я стараюсь не использовать для этого какие-либо внешние библиотеки, такие как numpy или math. Подробнее об этой sorted функции читайте здесь.

Сортировка только по ширине —

введите описание изображения здесь

 sorted(l, key=lambda x: int(x.split('x')[0]), reverse=True)
 

Сортировка только по высоте —

введите описание изображения здесь

 sorted(l, key=lambda x: int(x.split('x')[1]), reverse=True)
 

Сортировка по соотношению сторон (ширина/высота) —

введите описание изображения здесь

 sorted(l, key=lambda x: int(x.split('x')[0])/int(x.split('x')[1]), reverse=True)
 

Сортировка по количеству пикселей (ширина*высота) —

введите описание изображения здесь

 sorted(l, key=lambda x: int(x.split('x')[0])*int(x.split('x')[1]), reverse=True)
 

Сортировка по размеру экрана монитора (диагональ экрана) —

размер экрана = sqrt((ширина^2) (высота^2))

введите описание изображения здесь

 sorted(l, key=lambda x: (int(x.split('x')[0])**2 int(x.split('x')[1])**2)**(1/2), reverse=True)
 
 ['1920x1080',
 '1600x900',
 '1280x1024',
 '1152x864',
 '1024x768',
 '800x600',
 '720x400',
 '640x480']
 

Ответ №2:

Просто используйте key параметр sorted :

 res = sorted(data, key=lambda x: [int(s) for s in x.split("x")], reverse=True)
print(res)
 

Выход

 ['1920x1080', '1600x900', '1280x1024', '1152x864', '1024x768', '800x600', '720x400', '640x480']
 

Это разорвет связи по высоте

Ответ №3:

Вы можете использовать sorted пользовательскую функцию, здесь я беру продукт (т. Е. Общий размер пикселя) двух измерений:

 l = ['1152x864', '1920x1080', '1600x900', '1280x1024', '1024x768', '640x480', '720x400', '800x600']

from math import prod
sorted(l, key=lambda x: prod(map(int, x.split('x'))), reverse=True)
 

выход:

 ['1920x1080',
 '1600x900',
 '1280x1024',
 '1152x864',
 '1024x768',
 '800x600',
 '640x480',
 '720x400']
 

Ответ №4:

По какому критерию вы хотите провести сортировку?

 l = ['1152x864', '1920x1080', '1600x900', '1280x1024', '1024x768', '640x480', '720x400', '800x600']
 

По ширине:

 sorted(l, key=lambda dim: int(dim.split('x')[0]), reverse=True)
# ['1920x1080', '1600x900', '1280x1024', '1152x864', '1024x768', '800x600', '720x400', '640x480']
 

По высоте:

 sorted(l, key=lambda dim: int(dim.split('x')[1]), reverse=True)
# ['1920x1080', '1280x1024', '1600x900', '1152x864', '1024x768', '800x600', '640x480', '720x400']
 

По общему количеству пикселей:

 import math
sorted(l, key=lambda dim: math.prod(map(int, dim.split('x'))), reverse=True)
# ['1920x1080', '1600x900', '1280x1024', '1152x864', '1024x768', '800x600', '640x480', '720x400']
 

По длине диагонали:

 import math
sorted(l, key=lambda dim: math.hypot(*map(int, dim.split('x'))), reverse=True)
# ['1920x1080', '1600x900', '1280x1024', '1152x864', '1024x768', '800x600', '720x400', '640x480']
 

Соответствующая документация:

Ответ №5:

Используйте соответствующую метрику сортировки, которую вы можете реализовать как простую функцию и передать в sort качестве key параметра, например:

 def key(res):
    return (*map(int, s.split("x")))

resolutions.sort(key=key, reverse=True)
 

Сначала будет произведена сортировка по ширине, а затем по высоте. Или в более общем плане:

 def key(res):
    width, height = map(int, s.split("x"))
    result = # ... any numeric value calculated from the two
    return result
 

Ответ №6:

Вы можете использовать эту функцию, она сделает трюк.

 def orderByResolution(arr):
mytempdict = {}
result = []
for i in arr:
    mykey = int(i[:i.index('x')])
    mytempdict[mykey] = i

for i in reversed(sorted(mytempdict)):
    result.append(mytempdict[i])

return result
 

Ответ №7:

если вы хотите сортировать так, как хотите, чтобы получить желаемый результат, вы можете попробовать это:

 def bubbleSort(arr):
    arr = arr.copy()
    n = len(arr)
 
    # Traverse through all array elements
    for i in range(n-1):
    # range(n) also work but outer loop will repeat one time more than needed.
 
        # Last i elements are already in place
        for j in range(0, n-i-1):
 
            # traverse the array from 0 to n-i-1
            # Swap if the element found is greater
            # than the next element
            if int(arr[j].split("x")[0]) < int(arr[j   1].split("x")[0]) :
                arr[j], arr[j   1] = arr[j   1], arr[j]
    
    return arr

if __name__ == "__main__":
    inp_reso = ['1152x864', '1920x1080', '1600x900', '1280x1024', '1024x768', '640x480', '720x400', '800x600']
    print(bubbleSort(inp_reso))


 

но если вы хотите отсортировать по количеству пикселей на экране, вы должны выбрать:

 def bubbleSort(arr):
    arr = arr.copy()
    n = len(arr)
 
    # Traverse through all array elements
    for i in range(n-1):
    # range(n) also work but outer loop will repeat one time more than needed.
 
        # Last i elements are already in place
        for j in range(0, n-i-1):
 
            # traverse the array from 0 to n-i-1
            # Swap if the element found is greater
            # than the next element
            if eval(arr[j].replace("x", "*")) < eval(arr[j   1].replace("x", "*")) :
                arr[j], arr[j   1] = arr[j   1], arr[j]
    
    return arr

if __name__ == "__main__":
    inp_reso = ['1152x864', '1920x1080', '1600x900', '1280x1024', '1024x768', '640x480', '720x400', '800x600']
    print(bubbleSort(inp_reso))

 

Комментарии:

1. Не уверен, действительно ли необходима повторная реализация алгоритма сортировки 😉

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

Ответ №8:

 l=['1152x864', '1920x1080', '1600x900', '1280x1024', '1024x768', '640x480', '720x400', '800x600']

for i in range(len(l)):
    l[i]=float(l[i].replace ('x','.'))

l.sort(reverse=True)

for i in range(len(l)):
    l[i]=str(l[i]).replace ('.','x')
print(l)