Как подсчитать значения в словаре и распечатать ключ и значение, связанные с максимальной суммой

Я создал программу-анаграмму, которая берет все слова из файла и печатает буквы, за которыми следуют все слова из файла, которые можно создать, используя эти буквы. Это пример того, что он печатает:

cinos ['cions', 'coins', 'icons', 'scion', 'sonic']

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

from collections import defaultdict

f= open('dictionary.txt')
d= defaultdict(list)
for line in f:
    strip=line.rstrip()
    key = "".join(sorted(strip))
    d[key].append(strip)
count=0
for values in d.values():
    if len(values)>count:
        count=len(values)
        print(values)

Это печатает все значения, когда-либо назначенные для подсчета, но я просто хочу распечатать последнюю запись, связанную с подсчетом. Я пробовал значения [-1], но это не сработало.


person user3617808    schedule 08.05.2014    source источник
comment
Можем ли мы увидеть всю трассировку стека, пожалуйста? Я мог бы, вероятно, некоторое время проверить ваш код и выяснить, что вызывает ошибку, но было бы проще, если бы вы просто вставили всю ошибку.   -  person Nacho    schedule 09.05.2014


Ответы (4)


Непонятно, чего вы ожидаете

count="".count(values)

сделать, но Python пытается интерпретировать это как «подсчитайте, сколько раз строковый объект, на который ссылается имя values, появляется в строковом объекте ''», что подходит к неизбежному и неудачному концу, поскольку values не является строковым объектом и '' все равно пусто.

person jonrsharpe    schedule 08.05.2014
comment
Я изменил его на len(значения) - person user3617808; 09.05.2014
comment
Ну, теперь вы пытаетесь найти max(len(values)); как вы могли бы найти наибольшее значение одного значения? max ожидает что-то, что он может повторить, сравнивая размеры содержащихся в нем объектов, но вы даете ему единственное значение. - person jonrsharpe; 09.05.2014
comment
Ок опять все поменял. Это лучше? - person user3617808; 09.05.2014

d = { "taf": ["aft", "fat"], ... }
max_d = max(d.values(), key=len)

Я думаю, это то, что вы пытаетесь сделать. У вас есть словарь d случайных букв в качестве ключей с их возможными анаграммами в виде списка значений. Ваша цель — вернуть ключ с САМЫМ ДЛИННЫМ списком значений, верно?

Тем не менее, это кажется НЕВЕРОЯТНО интенсивным по памяти. Если бы я был вами, я бы сделал это вместо этого:

lst_of_random_letters = ["abcdef", "abcdeg", "abcdeh" ... ] # however you're generating this
def make_anagrams(letters):
    # however you're implementing this
    # but return a list of the anagrams, e.g.
    # [IN] : cions
    # [OUT]: ['cions', 'coins', 'icons', 'scion', 'sonic']

longest_anagrams = max((make_anagrams(letters) for letters in lst_of_random_letters), key=len)
person Adam Smith    schedule 08.05.2014
comment
Нет, мне нужно вернуть только значения, связанные с этим ключом. Значения содержат анаграммы, и это все, что я хочу перечислить. - person user3617808; 09.05.2014
comment
@ user3617808 О, вы сказали это в своем вопросе, извините, я неправильно понял. Я отредактировал оба фрагмента кода, чтобы отразить это изменение. - person Adam Smith; 09.05.2014
comment
Я снова отредактировал цикл for, и по большей части он работает. Просто пытаюсь понять, как сказать ему просто напечатать последний список значений, связанных с количеством, а не все списки. - person user3617808; 09.05.2014
comment
@user3617808 user3617808 Очень хорошо подумайте, что ваш код делает в этом цикле for. Как вы сохраняете самое большое значение? Вы его сохраняете? ДОЛЖНЫ ли вы быть? Кроме того: почему вы вообще ДЕЛАЕТЕ это с циклом for? Это то, для чего max буквально создан. - person Adam Smith; 09.05.2014

ваша ошибка вызвана:

count="".count(values)

которому вы даете values, который был определен как список в:

d = defaultdict(list)

как говорится на странице справки count:

count(...)
    S.count(sub[, start[, end]]) -> int

    Return the number of non-overlapping occurrences of substring sub in
    string S[start:end].  Optional arguments start and end are
    interpreted as in slice notation.

это вряд ли сработает.

вместо этого предпочитаю:

largest_group = max(d, key=lambda x: len(d[x]))

как было предложено @AdamSmith (отказ от ответственности: я собирался написать то же самое, что и вы, опубликовав свой ответ)

person zmo    schedule 08.05.2014
comment
Отказ от ответственности не требуется. Меня смутил его метод, и я отказался от него целиком, что, вероятно, не лучший подход, когда мы пытаемся учить :D. Однако я сделал опечатку в своем ответе - max(d, key=lambda x: len(d[x])) - правильный формат. - person Adam Smith; 09.05.2014

Это вызывает len для каждого значения и возвращает самое длинное значение.

max(d.values(), key=len)

Если 2 или более значений имеют одинаковую длину, вы все равно получите одно из них.

person John La Rooy    schedule 08.05.2014