Как отсортировать множество путей папок по длине?
folders_paths — это множество путей к папкам. Но когда я перебираю их, чтобы переименовать, они лежат во множестве после добавления случайным образом. И я могу переименовать их только когда так совпало, что они лежат во множестве в правильном порядке. Как я могу отсортировать множество, например по длине. Чтобы самые длинные файлы лежали в начале?
for folder_for_rename in folders_paths: print(sort(folders_paths), 'sorted') new_name = normalize(str(folder_for_rename.name)) print(folders_paths, '!') print(folder_for_rename,'*') print(str(split(folder_for_rename)[0]),'**') print(new_name.split('.')[0],'***') os.rename(folder_for_rename, str(split(folder_for_rename)[0]) + '\\' + new_name.split('.')[0])
Отслеживать
24.8k 4 4 золотых знака 20 20 серебряных знаков 36 36 бронзовых знаков
6 примеров сортировки в Python с помощью функции sorted
13 мая 2017 г. Archy Просмотров: 212558 RSS 9
Python для начинающих » Общие вопросы сортировка кортежа, сортировка словарей, сортировка списка, Функция sorted
Общей идиомой в программировании является сортировка списка. Python делает эту задачу очень простой благодаря встроенной функции sorted() которая принимает итерируемый тип и возвращает отсортированный список:
1. Стандартная сортировка
a = [3, 2, 5 ,4, 7, 1] a = sorted(a) print(a) # [1, 2, 3, 4, 5, 7]
t = ('Zane', 'Bob', 'Janet') t = sorted(t) print(t) # ['Bob', 'Janet', 'Zane']
d = d = sorted(d) print(d) # [1, 2, 3]
Обратите внимание на то, что функция sorted() возвращает список каждый раз, несмотря на то, какой тип был передан. В случае со словарями, она возвращает отсортированный список словарных ключей.
2. Сортировка сложных структур с использованием ключа
Это нормально работать с вещами, у которых по природе есть определенный порядок, вроде чисел или строк, но что делать с более сложными структурами? Здесь функция sorted() демонстрирует свое великолепие. Функция sorted() принимает ключ в качестве опционально названного параметра. Этот ключ должен быть, сам по себе, функцией, которая принимает один параметр, которая затем используется функцией sorted(), для определения значения в целях дальнейшей сортировки. Давайте взглянем на пример. Скажем, у нас есть класс Person с такими атрибутами как имя и возраст:
class Person(object): def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return "" % (self.name, self.age)
(Функция __repr__ является специальной функцией, которая используется для переопределения того, как объект будет представлен в интерпретаторе Python)
Причина, по которой я определил функцию – это выделение порядка сортировки. По умолчанию, представление определенных пользователем объектов выглядит примерно так: “ ”. Если оставить все как есть, то отличать различные экземпляры в будущих примерах будет несколько затруднительно для нас.
Давайте сделаем список людей:
jack = Person('Jack', 19) adam = Person('Adam', 43) becky = Person('Becky', 11) people = [jack, adam, becky]
Сама по себе функция sorted() не знает, что делать со списком людей:
a = sorted(people) print(a) # [, , ]
Однако, мы можем указать функции sorted(), какой атрибут сортировать, указав используемый ключ. Давайте определим это в следующем примере:
def byName_key(person): return person.name
Функция ключа должна принять один аргумент и выдать значение, на котором базируется сортировка. Функция sorted() должна вызвать функцию key в каждом элементе используемой итерируемой, и использовать значение выдачи при сортировке списка.
a = sorted(people, key = byName_key) print(a) # [, , ]
Обратите внимание на то, что мы передаем ссылку на саму функцию, не вызывая ее и передаем ссылку к её возвращаемому значению. Это очень важный момент. Помните, sorted() будет использовать функцию key, вызывая её в каждом элементе итерируемой.
Давайте взглянем на еще один код, на этот раз определяем возраст как значение для сортировки:
def byAge_key(person): return person.age a = sorted(people, key = byAge_key) print(a) # [, , ]
3. Обратная сортировка
Функция sorted() намного упрощает сортировку в обратном порядке. Функция принимает опциональный параметр под названием reverse, который действует по строгой логике.
data = [3, 2, 5 ,4, 7, 1] a = sorted(data, reverse = True) print(a) # [7, 5, 4, 3, 2, 1] data = ('Zane', 'Bob', 'Janet') b = sorted(data, reverse = True) print(b) # ['Zane', 'Janet', 'Bob']
4. Сортировка с использованием функции attrgetter
В этот раз, возвращаемый список отсортирован по возрасту, как мы и ожидали. Фактически, сортировка по определенному атрибуту объекта это простая задача Python, которую может выполнить стандартная библиотека, благодаря функции, которая может генерировать функции ключей для вас:
from operator import attrgetter
Результат вызова attrgetter() – это функция, схожая с предыдущими двумя, которые мы только что рассмотрели. Мы определяем имя атрибута для выборки, после чего attrgetter генерирует функцию, которая принимает объект и возвращает определенный атрибут из этого объекта.
getName = attrgetter('name') result = getName(jack) print(result) # 'jack'
Таким образом, attrgetter(name) возвращает функцию, которая ведет себя также как и определенная раннее нашей функцией byName_key():
result = sorted(people, key = attrgetter('name')) print(result) # [, , ]
Функция attrgetter(age) возвращает функцию, которая ведет себя также как и определенная раннее нашей функцией byAge_key():
result = sorted(people, key = attrgetter('age')) print(result) # [, , ]
5. Предварительное использование key в функции сортировки
До сих пор нашими ключевыми функциями были простые считыватели атрибутов, но они также могут вычислять значения для сортировки. Давайте взглянем на еще один пример. На этот раз мы определим класс Snake:
class Snake(object): def __init__(self, name, toxicity, aggression): self.name = name self.toxicity = toxicity self.aggression = aggression def __repr__(self): return "" % self.name
У нашей змеи есть имя, toxicity (токсичность, мерило того, насколько токсичен её яд) и agression (представленная в виде числа от 0 до 1, которое указывает на вероятность того, что змея нападет).
Надежный сайт по продвижению doctorsmm предлагает купить подписчиков на свой Телеграмм канал по очень выгодным и притягательным ценам от 51 рубля за сотню аккаунтов. Кроме того, Вы сможете подобрать наиболее оптимальную для Вашего сообщества скорость поступления, которая доходит до 1000 единиц в сутки.
gardenSnake = Snake('gardenSnake', 10, 0.1) rattleSnake = Snake('rattleSnake', 100, 0.25) kingCobra = Snake('kingCobra', 50, 1.0) snakes = [rattleSnake, kingCobra, gardenSnake]
Теперь предположим, что мы можем подсчитать, насколько опасная змея, основываясь на показателях токсичности и агрессивности, и можем отсортировать список змей по степени их опасности:
def byDangerous_key(snake): return snake.toxicity * snake.aggression result = sorted(snakes, key = byDangerous_key) print(result) # [, , ]
Змеи отсортированы в ожидаемом нами порядке (несмотря на то, что гремучая змея (rattlesnake) более ядовита, чем кобра (kingCobra), уровень агрессивности кобры делает её более опасной).
6. Случайная сортировка
Ключи не обязаны иметь какую-либо связь с сортируемыми элементами (однако, это не самый продуктивный способ сортировать что-либо). Мы можем создать случайный порядок со следующим ключом:
from random import random def randomOrder_key(element): return random()
Функция random() – это часть стандартной библиотеки random, которая выдает числа в случайном порядке от 0 до 1. Сортировка с использованием данного ключа выдает, кто бы мог подумать, случайный порядок:
a = sorted(snakes, key = randomOrder_key) print(a) # [, , ] b = sorted(snakes, key = randomOrder_key) print(b) # [, , ]
В данной статье мы рассмотрели то, как Python создает отсортированные списки (и другие итерируемые) и то, насколько это просто. По умолчанию, функция sorted() возвращает список, содержимое которого упорядоченно в естественном порядке (что, в общем, именно то что мы ожидаем от чисел и строк). Желающие углубиться в то, как работает функция sorted() могут обратиться к документации Python.
Мы также научились определять наш собственный порядок сортировки, передавая функцию key функции sorted(). Наши ключевые функции могут возвращать любое значение, какое нам угодно, но зачастую нам, скорее всего, понадобится отсортировать атрибут, который принадлежит каждому элементу списка. Фактически, эта ситуация возникает настолько часто, что Python поместили функцию operator.getattr() в стандартную библиотеку, которая может генерировать ключевые функции этого типа для нас.
Еще записи по теме
- Распаковка последовательности в отдельные переменные
- Вулкан Рич: щедрые бонусы и честные условия сотрудничества
- Социальные закладки, что это?
- Игровой автомат The Invisible Man — играй онлайн бесплатно в мобильное казино Вулкан
- Как интернет способен помочь в поиске работы?
- Первые шаги в wxPython [Урок №2]
- Бонусы на бесплатных азартных игровых слотах в онлайн казино
Как отсортировать множество python
33. Множества в Python. Тип данных set
34. Словари Python. Операции и методы словаря
35. 4 Ситуации, где полезно использовать словарь
36. Как отсортировать словарь в Python
37. Кортежи (tuple). Операции и методы кортежей
38. Функции (def). Определение и вызов функции
39. Зачем нужны функции в программировании
40. Возвращаемое значение функции. Оператор return
41. Область видимости: локальная, глобальная и встроенная.
Множество (set)
Множество (set) — неупорядоченная коллекция, хранящая набор уникальных значений и поддерживающая для них операции добавления, удаления и определения вхождения.
Также объект множество в Python поддерживает операции, аналогичные операциям с математическими множествами: объединение, пересечение, симметричная разность и вычитание множеств
Создание множества
Множество создается перечислением через запятую всех элементов внутри фигурных скобках.
>>> a = >>> a
В случае, если имеются повторяющиеся элементы внутри фигурных скобок, дубли во множестве все равно исчезнут. Множество не терпит среди элементов повторения.
>>> b = >>> b
Пустое множество создается при помощи функции set()
>>> c = set() >>> c set()
Также при помощи функции set() можно создавать множества из других объектов. Если передать строку, то получим множество из символов этой строки.
>>> d = set('abracadabra') >>> d
Также можно передавать функции set() списки и функцию range().
>>> e = set([1,3,3,1,2,3,3,7]) >>> e >>> f = set(range(1,4)) >>> f
Добавление элемента в множество
Первый способ добавить элемент в множество это вызвать метод add(). При попытке добавить уже существующий элемент во множество никаких ошибок не возникнет
>>> a = >>> a >>> a.add(4) >>> a >>> a.add(3) >>> a
Второй способ добавить элемент в множество это вызвать метод update() и передать ему итерируемый объект: список, строку, range() или множество. Метод update() будет поочередно добавлять каждый элемент итерируемого объекта внутрь множества.
>>> a >>> a.update([1,2,3,4]) >>> a >>> a.update('hi') >>> a >>> a.update(range(0,6)) >>> a
Удаление элемента из множество
Первый способ удалить элемент из множества это вызвать метод discard(value) и передать ему значение, которое хотите удалить. В случае, если в множестве нет значения, исключений не будет.
>>> a >>> a.discard(3) >>> a >>> a.discard(4) >>> a
Второй способ удалить элемент — это вызвать метод remove(value). В случае, если указанного значения в множестве нет, возбуждается исключение KeyError.
>>> a >>> a.remove(2) >>> a >>> a.remove(5) Traceback (most recent call last): File "", line 1, in a.remove(5) KeyError: 5
Третий способ удалить элемент — вызвать метод pop(). Т.к. множество является неупорядоченной коллекцией, данный метод удалит случайный элемент. При попытке удалить элемент из пустого множества возникнет исключение KeyError.
>>> a >>> a.pop() 1 >>> a.pop() 2 >>> a.pop() 3 >>> a.pop() Traceback (most recent call last): File "", line 1, in a.pop() KeyError: 'pop from an empty set'
Операции над множеством
Нахождение длины
>>> a = >>> len(a) 3 >>> len(set()) 0 >>> len(set([1,2,2])) 2
Проверка вхождения элемента во множество
>>> a >>> 2 in a True >>> 4 in a False >>> 5 not in a True
Пересечение множеств
При помощи оператора & можно выполнить пересечение множеств. В результат попадут те элементы, которые одновременно принадлежат двум множествам. При этом сами множества не меняются. Если нужно изменить само множество используйте эту операцию с присвоением &=.
>>> a = >>> b = >>> a & b >>> a,b (, ) >>> a &= b >>> a,b (, )
Объединение множеств
При помощи оператора | можно выполнить объединение множеств. В результат попадут те элементы, которые принадлежат хотя бы одному из множеств. При этом сами множества не меняются. Если нужно изменить само множество используйте эту операцию с присвоением |=.
>>> a = >>> b = >>> a | b >>> a,b (, ) >>> a |= b >>> a,b (, )
Вычитание множеств
При помощи оператора — можно выполнить вычитание множеств. В результат попадут только те элементы, которые принадлежат первому множеству за исключение тех, которые входят во второе.
>>> a = >>> b = >>> a - b >>> b - a >>> a,b (, ) >>> a -= b >>> a,b (, )
Сортировка по произвольным элементам вложенных списков
В Python можно выполнить сортировку списка на месте с помощью метода sort() :
>>> a = [10,3,4,1,9] >>> a.sort() >>> a [1, 3, 4, 9, 10]
Отметим, что есть аналогичная списковому методу sort() встроенная функция sorted() , которая не изменяет последовательность, а возвращает новую отсортированную.
Если элементы списка сами представляют собой списки, т. е. являются вложенными списками, то сортировка будет происходить по первым элементам вложенных списков, то есть в случае матрицы по первому столбцу:
>>> a = [[12,101],[2,200],[18,99]] >>> a.sort() >>> a [[2, 200], [12, 101], [18, 99]]
Что делать, если надо отсортировать не по первому столбцу? На этот случай sort() принимает необязательный аргумент key , в котором передается другая функция. Этой другой функции передается очередной элемент списка. Она может сделать с ним что угодно и вернуть что угодно. По этому «что угодно» и происходит сортировка.
Так, например, пользовательская функция может возвращать из переданного ей элемента, представляющего собой вложенный список, любой элемент этого вложенного списка. В свою очередь функция sort() будет сортировать по тем значениям, которые ей возвращаются.
В качестве примера приведем программу, в которой список представляет собой маленькую базу данных. Допустим, каждый элемент содержит сведения о юном спортсмене: имя, возраст, рост и вес. Пользователь может заказать сортировку по любому полю:
a = [['петя',10,130,35], ['вася',11,135,39], ['женя',9,140,33],['дима',10,128,30]] n = input('Сортировать по имени (1), возрасту (2), росту (3), весу (4): ') n = int(n)-1 def sort_col(i): return i[n] a.sort(key=sort_col) for i in a: print("%7s %3d %4d %3d" % (i[0],i[1],i[2],i[3]))
Здесь пользователь вводит номер поля. Число приводится к типу int , и из него вычитается единица, т. к. индексация списка начинается с нуля.
Далее определяется функция sort_col() . Ей передается аргумент i , а она возвращает n -ый элемент этого аргумента. Так, если этой функции передать вложенный список, то она вернет его n -й элемент. В данном случае тот, который хотел пользователь.
В функции sort() указывается пользовательская функция. Когда sort() извлекает очередной элемент списка, в данном случае — вложенный список, то передает этой функции. Получается, что элемент списка подменяется на то, что возвращает пользовательская функция.
В данном случае если пользователь заказывает сортировку по второму столбцу, вывод будет таким:
Сортировать по имени (1), возрасту (2), росту (3), весу (4): 2 женя 9 140 33 петя 10 130 35 дима 10 128 30 вася 11 135 39
Можно не определять обычную функцию, а использовать lambda-функцию:
a = [['петя',10,130,35], ['вася',11,135,39], ['женя',9,140,33],['дима',10,128,30]] n = input('Сортировать по имени (1), возрасту (2), росту (3), весу (4): ') n = int(n)-1 a.sort(key=lambda i: i[n]) for i in a: print("%7s %3d %4d %3d" % (i[0],i[1],i[2],i[3]))
Кроме того, метод sort() имеет еще один необязательный параметр по ключевому слову — reverse . По умолчанию он равен False . Это значит, что сортировка происходит по возрастанию. Однако если у reverse будет значение True , то сортировка будет обратной, т. е. по убыванию. В измененной программе ниже реализована возможность выбора типа сортировки:
a = [['петя',10,130,35], ['вася',11,135,39], ['женя',9,140,33],['дима',10,128,30]] n = input('Сортировать по имени (1), возрасту (2), росту (3), весу (4): ') n = int(n)-1 t = input('По возрастанию (0), по убыванию (1): ') t = int(t) a.sort(key=lambda i: i[n], reverse=t) for i in a: print("%7s %3d %4d %3d" % (i[0],i[1],i[2],i[3]))
При сортировке по весу по убыванию получим:
Сортировать по имени (1), возрасту (2), росту (3), весу (4): 4 По возрастанию (0), по убыванию (1): 1 вася 11 135 39 петя 10 130 35 женя 9 140 33 дима 10 128 30