Функция, возвращающая словарь с длинами строк (ключами) и номером вхождения (значениями) из списка - PullRequest
0 голосов
/ 13 апреля 2020

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

def length_counts(stringList):
    stringDict = {}
    for value in stringList:
        stringDict[len(value)] = stringList.count(value)
    return stringDict

#test
sa_countries = ["Brazil", "Venezuela", "Argentina", "Ecuador", "Bolivia", "Peru"]
print(length_counts(sa_countries))

Вывод:

{6: 1, 9: 1, 7: 1, 4: 1}

Правильный вывод должен быть:

{6: 1, 9: 2, 7: 2, 4: 1}

Что говорит, что есть 1 строка из 6 букв, 2 строки из 9 букв, 2 строки из 7 букв и 1 строка из 4 букв.

Ответы [ 4 ]

1 голос
/ 13 апреля 2020

count даст вам количество вхождений этого конкретного элемента. Таким образом, граф Венесуэла даст вам номер Венесуэлы в списке, а не количество 9 буквенных слов. Попробуйте что-то вроде этого.

sa_countries = ["Brazil", "Venezuela", "Argentina", "Ecuador", "Bolivia", "Peru"]

dict = {}
for country in sa_countries:
    if (len(country) in dict):
        dict[len(country)] += 1
    else:
        dict[len(country)] = 1

print(dict)
0 голосов
/ 13 апреля 2020

Один из возможных подходов - использовать collection.Counter ; Counter для:

from collections import Counter

sa_countries = ["Brazil", "Venezuela", "Argentina", "Ecuador", "Bolivia", "Peru"]
result = Counter(map(len, sa_countries))
print(result)

вывод

Counter({9: 2, 7: 2, 6: 1, 4: 1})

Из документации:

Счетчик подкласс dict для подсчета хэшируемых объектов. Это коллекция, в которой элементы хранятся в виде словарных ключей, а их счетчики хранятся в виде значений словаря. Счет может быть любым целочисленным значением, включая ноль или отрицательный счет. Класс Counter похож на сумки или мультимножества на других языках.

0 голосов
/ 13 апреля 2020

Вы переписываете свои значения.

Сначала вы делаете stringList.count('Venezuela'), что равно 1. Затем вы делаете stringList.count('Argentina'), что также равно 1. Таким образом, вы получаете значение 1 для ключа * 1006. *, дважды.

Сначала я бы преобразовал начальный список в список, содержащий длины.

sa_countries = ["Brazil", "Venezuela", "Argentina", "Ecuador", "Bolivia", "Peru"]
sa_countries_lens = [len(s) for s in sa_countries]

То есть [6, 9, 9, 7, 7, 4]. Теперь я бы сделал подсчет:

from collections import Counter

Counter(sa_countries_lens)

Результат:

Counter({6: 1, 9: 2, 7: 2, 4: 1})

Счетчик - это в основном диктат, и вы можете выполнить диктовку с приращением и проверкой ключа, но Счетчик лучше, часть стандартной библиотеки и довольно широко распространена.

0 голосов
/ 13 апреля 2020

Вы можете использовать collections.defaultdict для накопления количества строк.

from collections import defaultdict
def length_counts(countries):
    result = defaultdict(int)
    for country in countries:
        result[len(country)] += 1
    return result

Пример

>>> length_counts(sa_countries)
defaultdict(<class 'int'>, {6: 1, 9: 2, 7: 2, 4: 1})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...