【问题标题】:Reverse lookup Dictionary反向查找字典
【发布时间】:2021-01-21 06:33:47
【问题描述】:

我有以下字典,我想进行反向查找。

countries_dict = {'Andorra': ('Europe', 'Andorra la Vella'),
              'Afghanistan': ('Asia', 'Kabul'),
              'Antigua and Barbuda': ('North America', "St. John's"),
              'Albania': ('Europe', 'Tirana'),
              'Armenia': ('Asia', 'Yerevan'),
              'Angola': ('Africa', 'Luanda'),
              'Argentina': ('South America', 'Buenos Aires'),
              'Austria': ('Europe', 'Vienna'),
              'Australia': ('Oceania', 'Canberra'),
              'Azerbaijan': ('Asia', 'Baku'),
              'Barbados': ('North America', 'Bridgetown'),
              'Bangladesh': ('Asia', 'Dhaka'),
              'Belgium': ('Europe', 'Brussels')}

我的代码如下所示:

def create_continents_dict(dct = dict) -> dict:
    reversed_dictionary = {value[0] : key for (key, value) in dct.items()}
    return reversed_dictionary

print(create_continents_dict(countries_dict))

{'Europe': 'Belgium', 'Asia': 'Bangladesh', 'North America': 'Barbados', 'Africa': 'Angola', 'South America': 'Argentina', 'Oceania': 'Australia'}

但是,我只得到它查找为价值的最后一个国家/地区。我想要的是作为国家列表的价值。使用上面的代码,我应该期望拥有同一大陆的每个国家/地区,它应该在一个列表中,对吧?

{'Europe': ['Andorra', 'Albania', 'Austria', 'Belgium'] 'Asia': ['Afghanistan', 'Armenia', 'Azerbaijan', 'Bangladesh'], 'North America': ['Antigua and Barbuda', 'Barbados'], 'Africa': ['Angola'], 'South America': ['Argentina'], 'Oceania': ['Australia']}

【问题讨论】:

    标签: python dictionary reverse-lookup


    【解决方案1】:

    您可以将dict.setdefault() 与默认列表([])一起使用,然后在其中附加国家/地区:

    out = {}
    for country, (continent, _) in countries_dict.items():
        out.setdefault(continent, []).append(country)
    
    print(out)
    

    打印:

    {'Europe': ['Andorra', 'Albania', 'Austria', 'Belgium'], 
     'Asia': ['Afghanistan', 'Armenia', 'Azerbaijan', 'Bangladesh'], 
     'North America': ['Antigua and Barbuda', 'Barbados'], 
     'Africa': ['Angola'], 
     'South America': ['Argentina'], 
     'Oceania': ['Australia']}
    

    【讨论】:

      【解决方案2】:

      你可以在这里使用collections.defaultdict

      def reverse_dict(countries_dict):
          reversed_dictionary  = defaultdict(list)
          for key, value in countries_dict.items():
              reversed_dictionary[value[0]].append(key)
          return reversed_dictionary
      
      >>> reverse_dict(countries_dict)
      defaultdict(<class 'list'>,
                  {'Europe': ['Andorra', 'Albania', 'Austria', 'Belgium'],
                   'Asia': ['Afghanistan', 'Armenia', 'Azerbaijan', 'Bangladesh'],
                   'North America': ['Antigua and Barbuda', 'Barbados'],
                   'Africa': ['Angola'],
                   'South America': ['Argentina'],
                   'Oceania': ['Australia']})
      

      【讨论】:

        【解决方案3】:

        试试

        from collections import defaultdict 
        countries_dict = {'Andorra': ('Europe', 'Andorra la Vella'),
                      'Afghanistan': ('Asia', 'Kabul'),
                      'Antigua and Barbuda': ('North America', "St. John's"),
                      'Albania': ('Europe', 'Tirana'),
                      'Armenia': ('Asia', 'Yerevan'),
                      'Angola': ('Africa', 'Luanda'),
                      'Argentina': ('South America', 'Buenos Aires'),
                      'Austria': ('Europe', 'Vienna'),
                      'Australia': ('Oceania', 'Canberra'),
                      'Azerbaijan': ('Asia', 'Baku'),
                      'Barbados': ('North America', 'Bridgetown'),
                      'Bangladesh': ('Asia', 'Dhaka'),
                      'Belgium': ('Europe', 'Brussels')}
        
        d = defaultdict(list)
        for k,v in countries_dict.items():
          d[v[0]].append(k)
        print(d)
        

        输出

        defaultdict(<class 'list'>, {'Europe': ['Andorra', 'Albania', 'Austria', 'Belgium'], 'Asia': ['Afghanistan', 'Armenia', 'Azerbaijan', 'Bangladesh'], 'North America': ['Antigua and Barbuda', 'Barbados'], 'Africa': ['Angola'], 'South America': ['Argentina'], 'Oceania': ['Australia']})
        

        【讨论】:

          【解决方案4】:
          def create_continents_dict(dct = dict) -> dict:
              reversed_dictionary = {}
              for key, value in dct.items():
                  if value[0] not in reversed_dictionary.keys():
                      reversed_dictionary[value[0]] = []
                  reversed_dictionary[value[0]].append(key)
              return reversed_dictionary
          

          输出:

          print(create_continents_dict(countries_dict))
          {'Europe': ['Andorra', 'Albania', 'Austria', 'Belgium'], 'Asia': ['Afghanistan', 'Armenia', 'Azerbaijan', 'Bangladesh'], 'North America': ['Antigua and Barbuda', 'Barbados'], 'Africa': ['Angola'], 'South America': ['Argentina'], 'Oceania': ['Australia']}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-30
            • 2021-12-22
            • 2010-09-06
            • 2018-06-04
            • 2011-02-16
            • 2018-03-30
            • 1970-01-01
            • 2011-10-01
            相关资源
            最近更新 更多