Сортировка Counter в Python по ключам
Я имею счетчик, который выглядит примерно так:
Counter: {('A': 10), ('C': 5), ('H': 4)}
Я хочу отсортировать его по ключам в алфавитном порядке, а не по методу counter.most_common()
.
Есть ли способ достичь этого?
4 ответ(ов)
Чтобы отсортировать элементы словаря, используя Python, вы можете воспользоваться модулем collections
и классом Counter
, который упрощает подсчет объектов, и модулем operator
для указания ключа сортировки. Вот пример, как это можно сделать:
from operator import itemgetter
from collections import Counter
c = Counter({'A': 10, 'C': 5, 'H': 4})
sorted_items = sorted(c.items(), key=itemgetter(0))
print(sorted_items)
В этом коде Counter
создает словарь, представляющий количество элементов. Затем, используя sorted()
и itemgetter(0)
, мы сортируем элементы по ключу (в данном случае, по символам 'A', 'C', 'H'). Результатом выполненного кода будет отсортированный список кортежей:
[('A', 10), ('C', 5), ('H', 4)]
Таким образом, элементы отсортированы по алфавиту.
Для сортировки элементов счетчика collections.Counter
по ключам можно использовать следующий код:
import collections
arr = [2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19]
c = collections.Counter(arr)
sorted_items = sorted(c.items(), key=lambda i: i[0])
На выходе вы получите отсортированный список кортежей по ключам:
[(1, 1), (2, 3), (3, 2), (4, 1), (6, 1), (7, 1), (9, 1), (19, 1)]
Если вам нужно получить результат в формате словаря, вы можете просто обернуть функцию sorted
в dict
:
sorted_dict = dict(sorted(c.items(), key=lambda i: i[0]))
Это вернет следующий словарь:
{1: 1, 2: 3, 3: 2, 4: 1, 6: 1, 7: 1, 9: 1, 19: 1}
Таким образом, с помощью sorted
и dict
можно получить как отсортированный список кортежей, так и словарь, отсортированный по ключам.
Чтобы получить значения в отсортированном порядке из счетчика, вы можете использовать следующий код:
import collections
array = [1, 2, 3, 4, 5]
counter = collections.Counter(array)
sorted_occurrences = list(dict(sorted(counter.items())).values())
В этом коде мы создаем Counter
из массива, который подсчитывает количество вхождений элементов. Затем мы сортируем элементы счетчика с помощью sorted()
, преобразуем их в словарь и извлекаем значения с помощью метода .values()
. В итоге мы получаем список значений в отсортированном порядке.
Для обеспечения сортировки элементов Counter
в Python по ключам, вы можете использовать метод sorted()
, как в вашем примере. Однако следует отметить, что Counter
сохраняет количество каждого элемента и, как вы указали, сортировка по ключам может изменить порядок представления в итоговом объекте.
Вот простой пример, который демонстрирует это:
from collections import Counter
# Исходные данные
counter = Counter({'A': 10, 'C': 5, 'H': 7})
# Сортировка Counter по ключам
sorted_counter = sorted(counter.items())
# Возврат к объекту Counter
result_counter = Counter(sorted_counter)
# Вывод результата
print(result_counter)
Выходной результат будет:
Counter({'A': 10, 'C': 5, 'H': 7})
Теперь касательно вашего второго примера. Если вы измените входные данные на {"a": "1", "t": "1", "e": "1"}
, то использование Counter
и сортировка приведут к тому, что результат будет таким:
from collections import Counter
# Новые данные
counter2 = Counter({"a": "1", "t": "1", "e": "1"})
# Сортировка Counter по ключам
sorted_counter2 = sorted(counter2.items())
# Возврат к объекту Counter
result_counter2 = Counter(dict(sorted_counter2))
# Вывод результата
print(result_counter2)
Выходной результат будет:
Counter({'a': '1', 'e': '1', 't': '1'})
Таким образом, порядок элементов в итоговом Counter
будет зависеть от сортировки ключей, что приведет к изменению порядка, если входные данные изначально не отсортированы.
Преобразование словаря в JSON
Преобразование списка словарей в DataFrame pandas
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Скачать видео с YouTube с помощью Python в определённую директорию
Доступ к атрибутам на литералах работает для всех типов, кроме `int`; почему?