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

Я использую понимание dict, чтобы возвращать названия стран в качестве уникального ключа и хочу, чтобы значение было количеством городов в этой стране. Как подсчитать количество городов из списка кортежей?

country_city_tuples= [('Netherlands', 'Alkmaar'),
                      ('Netherlands', 'Tilburg'),
                      ('Netherlands', 'Den Bosch'),
                      ('Netherlands', 'Eindhoven'),
                      ('Spain', 'Madrid'),
                      ('Spain', 'Barcelona'),
                      ('Spain', 'Cordoba'),
                      ('Spain', 'Toledo'),
                      ('Italy', 'Milano'),
                      ('Italy', 'Roma')]

country_names = { 

}

Ожидаемый результат: {'Italy': 2 , 'Netherlands': 4, 'Spain': 4}

«Я использую диктовку для возврата названий стран» — где это?

meowgoesthedog 22.05.2019 11:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
75
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Использование defaultdict:

from collections import defaultdict

country_names  = defaultdict(int)
for i in country_city_tuples:
    country_names[i[0]]+=1

country_names
defaultdict(int, {'Netherlands': 4, 'Spain': 4, 'Italy': 2})
Ответ принят как подходящий

Вы можете извлечь названия стран из списка кортежей, используя zip, а затем использовать collections.Counter для подсчета частоты названий стран.

from collections import Counter

country_city_tuples= [('Netherlands', 'Alkmaar'),
                      ('Netherlands', 'Tilburg'),
                      ('Netherlands', 'Den Bosch'),
                      ('Netherlands', 'Eindhoven'),
                      ('Spain', 'Madrid'),
                      ('Spain', 'Barcelona'),
                      ('Spain', 'Cordoba'),
                      ('Spain', 'Toledo'),
                      ('Italy', 'Milano'),
                      ('Italy', 'Roma')]

#Extract out country names using zip and list unpacking
country_names, _ = zip(*country_city_tuples)

#Count the number of countries using Counter
print(dict(Counter(country_names)))

Чтобы сделать это без использования collections, мы можем использовать словарь для сбора частот

country_city_tuples= [('Netherlands', 'Alkmaar'),
                      ('Netherlands', 'Tilburg'),
                      ('Netherlands', 'Den Bosch'),
                      ('Netherlands', 'Eindhoven'),
                      ('Spain', 'Madrid'),
                      ('Spain', 'Barcelona'),
                      ('Spain', 'Cordoba'),
                      ('Spain', 'Toledo'),
                      ('Italy', 'Milano'),
                      ('Italy', 'Roma')]

#Extract out country names using zip and list unpacking
country_names, _ = zip(*country_city_tuples)

result = {}

#Count each country
for name in country_names:
    result.setdefault(name,0)
    result[name] += 1

print(result)

Результат будет одинаковым в обоих случаях

{'Netherlands': 4, 'Spain': 4, 'Italy': 2}

Попробуй это :

l = set(i[0] for i in country_city_tuples)
d = {}
for i in l:
   d[i] = sum([1 for j in country_city_tuples if j[0]==i])

Выход :

{'Italy': 2, 'Netherlands': 4, 'Spain': 4}

Используйте sum с генератором, который возвращает 1, если название страны совпадает с проверяемой страной, иначе 0:

{name: sum(1 if c[0] == name else 0
           for c in country_city_tuples)
 for name in set(c[0] for c in country_city_tuples)}

Вы также можете использовать dict.get:

r = {}
for name, city in country_city_tuples:
    r.get(name, 0) += 1

без использования defaultdict и других модулей

country_city_tuples= [('Netherlands', 'Alkmaar'),
                      ('Netherlands', 'Tilburg'),
                      ('Netherlands', 'Den Bosch'),
                      ('Netherlands', 'Eindhoven'),
                      ('Spain', 'Madrid'),
                      ('Spain', 'Barcelona'),
                      ('Spain', 'Cordoba'),
                      ('Spain', 'Toledo'),
                      ('Italy', 'Milano'),
                      ('Italy', 'Roma')]

country_names  = {}
for i in country_city_tuples:
    try:
        if country_names[i[0]]:
            country_names[i[0]]+=1
    except:
        country_names[i[0]]=1
print(country_names)

#output {'Netherlands': 4, 'Spain': 4, 'Italy': 2}

Другие вопросы по теме