简体   繁体   English

反向查找字典

[英]Reverse lookup Dictionary

I have the following dictionary and I would like to do a reverse lookup.我有以下字典,我想进行反向查找。

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')}

My code looks like this:我的代码如下所示:

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'}

However I only get the last country it looks up as value.但是,我只得到它作为价值查找的最后一个国家。 What I want is the value as a list of the countries.我想要的是作为国家列表的价值。 With the code above I should expect for every country that has the same continent, it should be in a list right?有了上面的代码,我应该期待每个拥有相同大陆的国家/地区的代码,它应该在列表中吗?

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

You can use dict.setdefault() with default list ( [] ) and then append the country in it:您可以将dict.setdefault()与默认列表 ( [] ) 一起使用,然后在其中附加国家/地区:

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

print(out)

Prints:印刷:

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

You could use collections.defaultdict here你可以在这里使用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']})

Try尝试

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)

output输出

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']})
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

Output:输出:

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']}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM