#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)