如何从嵌套字典中获取价值?

时间:2015-10-29 03:17:37

标签: python

我有以下信息:

zipcode = {"country_1": 
               {"city_1": 100, 
                "city_2": 103, 
                "city_3": 104},
           "country_2": 
               {"city_4": 208, 
                "city_5": 220, 
                "city_6": 221}
           }

如何编写三个函数:

  • 如果我输入country_1,它会打印该国家/地区的所有zipcode个城市?
  • 如果我输入任何city,则会打印相应的zipcode
  • 反之亦然(输入zipcode,返回city

3 个答案:

答案 0 :(得分:1)

  

如果我输入country_1,它会打印该国家/地区城市的所有邮政编码吗?

>>> zipcode = {'country_1': {'city_2': 103, 'city_3': 104, 'city_1': 100}, 'country_2': {'city_4': 208, 'city_6': 221, 'city_5': 220}}
>>> c = "country_1"; list(zipcode[c].values())
[103, 104, 100]
  

如果我输入任何城市,它将打印相应的邮政编码

>>> c = "city_1"; [d[c] for d in zipcode.values() if d.get(c)]
[100]

我将输出作为列表留在此处,因为有许多城市与其他国家/地区的城市共享名称。 (例如,SyracuseRome。)因此,这样可以找到多个邮政编码。

  

反之亦然?

>>> z=100; [k for d in zipcode.values() for k in d if d.get(k)==z]
['city_1']

对于后者,您可能想知道city_1所在的国家/地区。在这种情况下:

>>> z=100; ["{}, {}".format(k, c) for c, d in zipcode.items() for k in d if d.get(k)==z]
['city_1, country_1']

附录

评论中的以下代码存在问题:

z=input('please enter zipcode:')
print( [zipcode.keys() for zipcode.keys() in zipcode for zipcode in zipcode.values() if zipcode.get()==z] )

让我们从第一行开始:

>>> z=input('please enter zipcode:')
please enter zipcode:100

现在,让我们显示z以查看我们的内容:

>>> z
'100'

如您所见,z是一个字符串。但是,如上所示,可以看到变量zipcode中的邮政编码是整数。在将zzipcode中的任何内容匹配之前,我们必须使int成为整数。以下使用>>> z=int(input('please enter zipcode:')) please enter zipcode:100 >>> z 100 函数执行此操作:

zipcode.keys()

对于第二行,for zipcode in zipcode.values()是函数调用,但它用于需要变量的位置。同样,zipcode>>> print( [city for country in zipcode.values() for city in country if country.get(city)==z] ) ['city_1'] 视为两个不同的事物。修复这些问题会产生:

<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>

答案 1 :(得分:0)

你想要一个兼具两种功能的功能吗?这可能不是最好的主意!这样做你想要的:

zipcode = {"country_1": {"city_1": 100, "city_2": 103, "city_3": 104},"country_2": {"city_1": 208, "city_2": 220, "city_3": 221}}

def get_zipcode(word):
    if word in zipcode:
        return zipcode[word].values()

    for data in zipcode.values():
        if word in data:
            return data[word]

    return None

答案 2 :(得分:0)

尝试这个,有点棘手,但它会做什么(所有3合1)你要求:) 假设每个国家/地区名称,城市名称和邮政编码都是唯一的,get_value()会将相应的值返回到其输入。

按国家/地区名称:

>>> get_value('country_1', zipcode)
[103, 104, 100]

或按城市名称:

>>> get_value('city_3', zipcode)
104

或通过邮政编码:

>>> get_value('100', zipcode)
'city_1'

zipcode应该是你的嵌套词典:

def get_value(c, zipcode):

    if c in zipcode.keys():
        return zipcode[c].values()
    else:
        for d in zipcode.values():
            for k, v in d.iteritems():
                if c == k:
                    return d[k]
                try:
                    int(c) == v
                    return k
                except ValueError:
                    continue
    return None
相关问题