Есть список с вложенными списками. Нужно найти наиболее часто встречающийся список.
Пример:
Input:
[[1,2,3],[2,5,6],[8,2,1],[2,3,1]]
Output:
[1,2,3] -> 2 шт
Списки [1,2,3] и [2,3,1] cчитаются равными.
Ответ
Одной строкой (не считая импорта, инициализации s и вывода):
from collections import Counter
s = [[1,2,3],[2,5,6],[8,2,1],[2,3,1]]
sublist, count = max(Counter(tuple(sorted(x)) for x in s).items(), key=lambda x: x[1])
print('%s -> %d' % (list(sublist), count))
Разбор:
Превращаем s в набор сортированных кортежей (неизменяемых списков, по сути). Сортируем потому, что по условию списки различающиеся только порядком одинаковы, а после сортировки они становятся полностью совпадающими. Преобразование в кортеж нужно потому, что Counter из следующего пункта может считать только хешируемые объекты (списки к таким объектам не относятся, а вот кортежи - да): (tuple(sorted(x)) for x in input)
Отправляем это в Conter, получаем объект, в котором подсчитано, сколько каждый объект, в переданном ему "списке" (вообще, итерируемом объекте) встретился: Counter(...). Если на этом этапе вывести полученное значение, будет что-то вроде Counter({(1, 2, 3): 2, (1, 2, 8): 1, (2, 5, 6): 1})
Извлекаем из Counter пары (ключ, значение) (ключ - объект, значение - количество), находим элемент с максимальным значением количества: max(Counter(...).items(), key=lambda x: x[1]). Метод .items() как раз превращает Counter в набор пар (ключ, значение). Параметр key=lambda x: x[1] функции max говорит, что нужно отбирать максимальное по второму элементу каждой пары.
"Распаковываем" полученный элемент (пару подсписок-количество) в переменные sublist и count: sublist, count = max(...)
Выводим в виде "[список] -> количество", подсписок показываем в виде списка (а не кортежа): print('%s -> %d' % (list(sublist), count))
Вывод:
[1, 2, 3] -> 2
Ограничения:
Изначальный список должен иметь хотя бы один подсписок.
При выводе подсписок список всегда будет отсортированным, независимо от того, каким он был в исходном списке.
Если в исходном списке несколько подсписков, встречающихся наиболее часто, в результате будет показан только один из них.
Комментариев нет:
Отправить комментарий