Получить наиболее повторяющееся имя в списке или сначала в алфавитном порядке, если есть связь - PullRequest
3 голосов
/ 14 марта 2020

Я пытаюсь получить наиболее повторяющееся имя в списке, если оно находится на ie, вернуть то, что происходит в алфавитном порядке.

У меня есть следующий список:

names = ['sam','sam','leo','leo','john','jane','jane']

Для этого списка он должен вернуть jane, так как есть две связи с другими именами, но первое в алфавитном порядке.

У меня есть следующий код в python.

def get_count(lst):
    lst.sort()
    d = {}
    for item in lst:
        if item not in d:
            d[item] = [1]
        else:
            d[item].append(1)
    def get_count_child(d):
        fd = {}
        for key, value in d.items():
            fd[key] = sum(value)
        return fd
    return get_count_child(d)

Он выводит

{'jane': 2, 'john': 1, 'leo': 2, 'sam': 2}

Есть ли способ извлечь значение из jane с ограничениями, которые я упомянул выше?

Ответы [ 5 ]

4 голосов
/ 14 марта 2020

Скажите, d ваш словарь. Вы хотите отсортировать его элементы в порядке убывания значений (количества), но увеличивая ключи (имена). Первый отсортированный элемент в списке - это тот, который вам нужен:

wanted = sorted(d.items(), key=lambda x: (-x[1], x[0]))[0]
# ('jane', 2)
wanted[0]
# 'jane'

Обратите внимание на отрицание в лямбда-функции: она гарантирует, что меньшие значения выглядят «больше» и располагаются ближе к концу.

3 голосов
/ 14 марта 2020

Если вы используете python 3.7+, вы можете просто отсортировать имена, и dict сохранит порядок вставки.

from collection import Counter
names = sorted(['sam','sam','leo','leo','john','jane','jane'])
names_count = Counter(names)
names_count.most_common(1)

В противном случае, чтобы гарантировать порядок без зависимости от python версии, вы можете сделать следующее

def get_names_count(lst):
    names_count = {}
    for item in sorted(lst):
        names_count[item] = names_count.get(item, 0) + 1

    return names_count

def get_most_common_name(names_count):
    most_common = sorted(names_count, key=lambda x: (-x[1], x[0]))
    return most_common[0]

Обратите внимание, что я заменил lst.sort() на sorted(lst), так как это плохая практика для изменения глобальных объектов (python передает указатель на список, а не его копия)

Кроме того, нет необходимости хранить их счет в списке, так что вы можете сразу посчитать имена со значением по умолчанию 0 для имени

PS К тому времени, когда я написал DYZ уже ответил на этот вопрос, поэтому мой код - это просто рефакторинг вашего get_names_count

1 голос
/ 15 марта 2020

Измените возвращаемое значение функции "get_count_child" с помощью этого next(iter(sorted(fd)))

Таким образом, оно должно выглядеть следующим образом:

def get_count(lst):
    lst.sort()
    d = {}
    for item in lst:
        if item not in d:
            d[item] = [1]
        else:
            d[item].append(1)
    def get_count_child(d):
        fd = {}
        for key, value in d.items():
            fd[key] = sum(value)
        return fd[next(iter(sorted(fd)))]
    return get_count_child(d)
0 голосов
/ 22 марта 2020

Вот еще один способ получить тот же результат, используя модуль статистики:

from statistics import mode

def get_count(lst):
    lst.sort()
    return mode(lst)
0 голосов
/ 14 марта 2020

Python 3.7+ или CPython 3.6: Counter.most_common

Используйте collections.Counter для подсчета отсортированного списка, затем используйте его most_common метод , чтобы получить топовый предмет. Связи разрываются при первом появлении, поэтому список необходимо отсортировать.

from collections import Counter

c = Counter(sorted(names))
print(c.most_common(1))  # -> [('jane', 2)]
print(c.most_common(1)[0][0])  # -> jane

Это зависит от версии, так как полагается на базовый диктат для сохранения порядка вставки. См. Упорядочены ли словари в Python 3.6 +?

Если вы используете более раннюю версию, вы все равно можете использовать Counter, но использовать решение DYZ для выполнения сортировка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...