【问题标题】:Assign values to existing dictionary keys as the dictionary is being made using dictionary comprehension在使用字典理解创建字典时将值分配给现有字典键
【发布时间】:2021-10-25 13:08:42
【问题描述】:

Python:编写一个名为 big_countries 的函数:

  • 将字典(类型:dict)作为参数

输入

country_info = {'Afghanistan': ['Asia', 652230, 25500100, 20343000, True],
'Albania': ['Europe', 28748, 2831741, 12960000, False],
'Algeria': ['Africa', 2381741, 37100000, 188681000, True],
'Andorra': ['Europe', 468, 78115, 3712000, False],
'Angola': ['Africa', 1246700, 20609294, 100990000, True]}
  • 并返回另一个字典。返回的字典格式为:
  • 键→大陆(类型:str
  • value → 包含国家/地区的字符串列表(类型:list)(类型:str) 在那个大陆被定义为“大”或country_info['country_name'][4]True

我已经编写了以下代码,可以很好地完成上述任务。

filtered_dict = dict()
for (k,v) in country_info.items():
    if v[4]: filtered_dict[v[0]] = filtered_dict.get(v[0], []) + [k]
print(filtered_dict)

预期输出:

{'Asia': ['Afghanistan'], 'Africa': ['Algeria', 'Angola']}

但我有一种痒痒的感觉,这可以缩短为:

filtered_dict = {v[0] : filtered_dict.get(v[0], []) + [k] for (k,v) in country_info.items() if v[4]}

问题在于 1) 我很笨,2) filtered_dict.get() 在字典创建之前无法访问它,或者换句话说,我们还没有定义 filtered_dict

我可以这样做:

temp_dict = dict()
filtered_dict = {v[0] : temp_dict.get(v[0], []) + [k] for (k,v) in country_info.items() if v[4]}

#Output 
{'Asia': ['Afghanistan'], 'Africa': ['Angola']}

但每次出现同一大陆时,国家名称都会被覆盖。我希望附加的国家名称不会被覆盖。

谁能帮我写一个可能使用递归的更短版本的工作代码。 谢谢!

【问题讨论】:

  • 您确定输出应该是{'Asia': ['Afghanistan'], 'Africa': ['Algeria', 'Angola']} 而不是{'Asia': ['Afghanistan'], 'Africa': ['Algeria', 'Angola'], 'Europe': []}
  • @Stef 是的,我只想过滤带有country_info['country_name'][4] == True的值

标签: python dictionary recursion


【解决方案1】:
country_info = {'Afghanistan': ['Asia', 652230, 25500100, 20343000, True],
'Albania': ['Europe', 28748, 2831741, 12960000, False],
'Algeria': ['Africa', 2381741, 37100000, 188681000, True],
'Andorra': ['Europe', 468, 78115, 3712000, False],
'Angola': ['Africa', 1246700, 20609294, 100990000, True]}

def big_countries(country_info: dict) -> dict:
    filtered_dict = {}
    for k,v in  country_info.items():
        if v[4]:
            filtered_dict.setdefault(v[0], [])
            filtered_dict[v[0]].append(k)
    return filtered_dict


print(big_countries(country_info))

输出

{'Asia': ['Afghanistan'], 'Africa': ['Algeria', 'Angola']}

【讨论】:

    【解决方案2】:

    你当然可以简化你所拥有的:

    filtered_dict = {}
    for k, (x, *_, y) in country_info.items():
        if y: 
            filtered_dict.setdefault(x, []).append(k)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-21
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      相关资源
      最近更新 更多