创建一个字典,其中键是字典中列表中字典的值,值是它们出现的次数

Create a dictionary where the keys are values of dictionaries inside lists in a dictionary and the values are the number of times they appear

我有这本词典列表词典(我无法更改作品的结构):

dict_countries = {'gb': [{'datetime': '1955-10-10 17:00:00', 'city': 'chester'}, 
                         {'datetime': '1974-10-10 23:00:00', 'city': 'chester'}], 
                  'us': [{'datetime': '1955-10-10 17:00:00', 'city': 'hudson'}]
                 }

以及函数:

def Seen_in_the_city(dict_countries:dict,)-> dict:
    city_dict = {}
    for each_country in dict_countries.values():   
        for each_sight in each_country: 
            citi = each_sight["city"]
            if citi in city_dict.keys():
                city_dict[each_sight["city"]] =+1 
            else:
                city_dict[citi] =+1        
    return city_dict

我得到:

{'chester': 1,'hudson': 1}

而不是

{'chester': 2,'hudson': 1}

您无需说 +1 即可添加正数。同样在 if citi 语句中,+= 1 表示将 1 加到现有值 (1+1) 中,其中 as =+1 基本上是说再次给它一个值 1。

if citi in city_dict.keys():
    city_dict[each_sight["city"]] +=1 
else:
    city_dict[citi] = 1

尝试:

output = dict()
for country, cities in dict_countries.items():
    for city in cities:
        if city["city"] not in output:
            output[city["city"]] = 0
        output[city["city"]] += 1

您可以尝试使用 Python 标准库中 collections 模块的 Counterdict 的子类):

from collections import Counter
c = Counter()
for key in dict_countries:
    for d in dict_countries[key]:
        c.update(v for k, v in d.items() if k == 'city')
        
print(c)

输出

Counter({'chester': 2, 'hudson': 1})

您可以使用 itertools

中的 groupby
from itertools import groupby
print({i: len(list(j)[0])  for i,j in groupby(dict_countries.values(), key=lambda x: x[0]["city"])})

如果您不想额外导入(并不是说您不应该使用 Counter),还有另一种方法:

dict_countries = {'gb': [{'datetime': '1955-10-10 17:00:00', 'city': 'chester'}, 
                         {'datetime': '1974-10-10 23:00:00', 'city': 'chester'}], 
                  'us': [{'datetime': '1955-10-10 17:00:00', 'city': 'hudson'}]
                 }

def Seen_in_the_city(dict_countries:dict,)-> dict:
    city_dict = {}
    for each_country in dict_countries.values():   
        for each_sight in each_country: 
            citi = each_sight["city"]
            city_dict[citi] = city_dict.get(citi, 0) + 1       
    return city_dict

print(Seen_in_the_city(dict_countries))