Itertools反向映射的方式?

时间:2015-12-11 22:59:59

标签: python

我对国家/地区的映射有以下语言,例如,在比利时或荷兰可能会说荷兰语:''nl':['be','nl']

>>> MAP_LANGUAGE_TO_COUNTRIES_SPOKEN
{'vi': ['vn'], 'el': ['gr'], 'fr': ['be', 'ca', 'ch', 'fr', 'lu'], 'bg': ['bg'], 'zh': ['cn'], 'th': ['th'], 'hr': ['hr'], 'tr': ['tr'], 'bn': ['bd'], 'de': ['at', 'ch', 'de', 'lu'], 'it': ['ch', 'it'], 'da': ['dk'], 'ar': ['ae', 'bh', 'dz', 'eg', 'iq', 'jo', 'kw', 'lb', 'ly', 'ma', 'om', 'qa', 'sa', 'sy', 'tn', 'ye'], 'uk': ['ua'], 'fi': ['fi'], 'cs': ['cz'], 'et': ['ee'], 'hu': ['hu'], 'id': ['id'], 'es': ['ar', 'bo', 'cl', 'co', 'cr', 'do', 'ec', 'es', 'gt', 'hn', 'mx', 'ni', 'pa', 'pe', 'pr', 'py', 'sv', 'uy', 've'], 'he': ['il'], 'ru': ['ru'], 'nl': ['be', 'nl'], 'pt': ['br', 'pt'], 'no': ['no'], 'sr': ['ba', 'sp'], 'sq': ['al'], 'ko': ['kr'], 'sv': ['fi', 'se'], 'pa': ['in'], 'ja': ['jp'], 'lv': ['lv'], 'lt': ['lt'], 'hi': ['in'], 'en': ['au', 'bz', 'ca', 'gb', 'ie', 'jm', 'nz', 'ph', 'tt', 'us', 'za', 'zw'], 'sk': ['sk'], 'ms': ['bn', 'my'], 'sl': ['si'], 'ro': ['ro'], 'is': ['is'], 'pl': ['pl'], 'ta': ['in']}

反转此映射的最佳方法是什么?也就是说,将Country映射到那里所说的语言,例如:'ca': ['en', 'fr]。我打算做一些for循环但是认为可能有更好的方法来使用像itertools这样的东西。实现上述目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

最好的方法可能是使用defaultdict

d = {'vi': ['vn'], 'el': ['gr'], 'fr': ['be', 'ca', 'ch', 'fr', 'lu'], 'bg': ['bg'], 'zh': ['cn'], 'th': ['th'], 'hr': ['hr'], 'tr': ['tr'], 'bn': ['bd'], 'de': ['at', 'ch', 'de', 'lu'], 'it': ['ch', 'it'], 'da': ['dk'], 'ar': ['ae', 'bh', 'dz', 'eg', 'iq', 'jo', 'kw', 'lb', 'ly', 'ma', 'om', 'qa', 'sa', 'sy', 'tn', 'ye'], 'uk': ['ua'], 'fi': ['fi'], 'cs': ['cz'], 'et': ['ee'], 'hu': ['hu'], 'id': ['id'], 'es': ['ar', 'bo', 'cl', 'co', 'cr', 'do', 'ec', 'es', 'gt', 'hn', 'mx', 'ni', 'pa', 'pe', 'pr', 'py', 'sv', 'uy', 've'], 'he': ['il'], 'ru': ['ru'], 'nl': ['be', 'nl'], 'pt': ['br', 'pt'], 'no': ['no'], 'sr': ['ba', 'sp'], 'sq': ['al'], 'ko': ['kr'], 'sv': ['fi', 'se'], 'pa': ['in'], 'ja': ['jp'], 'lv': ['lv'], 'lt': ['lt'], 'hi': ['in'], 'en': ['au', 'bz', 'ca', 'gb', 'ie', 'jm', 'nz', 'ph', 'tt', 'us', 'za', 'zw'], 'sk': ['sk'], 'ms': ['bn', 'my'], 'sl': ['si'], 'ro': ['ro'], 'is': ['is'], 'pl': ['pl'], 'ta': ['in']}

from collections import defaultdict
rev = defaultdict(list)

for k,v in d.items():
    for c in v:
        rev[c].append(k)
print(rev["ca"])
['fr', 'en']

答案 1 :(得分:1)

d = {}
for k,v in MAP_LANGUAGE_TO_COUNTRIES_SPOKEN.iteritems():
    for k2 in v:
        d.setdefault(k2,[]).append(k)

我想