解开此嵌套词典的更好方法?

时间:2018-08-07 06:38:59

标签: python python-3.x dictionary nested

我得到了一个嵌套的字典,如下所示,它将在输入字典中的第一个键时返回第三个键

tree = {"Luke" : {"Darth Vader" : {"The Chancellor"}},
        "Neal" : {"Les" : {"Joseph"}},
        "George" : {"Fred" : {"Mickey"}},
        "Robert" : {"Tim" : {"Michael"}},
        "Juan" : {"Hunter" : {"Thompson"}}}



check_con = input("Enter your Name")
for fi_name,fi_second in tree.items():
    if check_con in fi_name:
        for fi_third,fi_fourth in fi_second.items():
            print(fi_fourth)

我觉得它还有更多步骤,还有其他方法可以做到吗?

问候

3 个答案:

答案 0 :(得分:3)

您可以使用默认值为空dict的dict.get方法来获取顶级dict,然后将其值转换为iter,使用next来获取第一个值

>>> check_con = 'Neal'
>>> next(iter(tree.get(check_con, {}).values()), '')
{'Joseph'}
>>> 
>>> check_con = 'xxx'
>>> next(iter(tree.get(check_con, {}).values()), '')
''
>>> 

答案 1 :(得分:1)

您可以简单地使用try-excep表达式来查找您的名字是否存在于字典中。如果存在,则可以返回各自值的所有值:

def get_nested_item(tree, check_on):
    try:
        sub_dict = tree[check_on]
    except KeyError:
        print("No result")
        return
    else:
        return sub_dict.values()

还请注意,关于检查字典中是否存在您的姓名,您要在此处进行的是以下行中的成员资格检查:

if check_con in fi_name:

不会检查是否相等,而是检查check_con是否出现在字典键中。但是,如果这是您要的内容,则必须遍历您的商品并找到想要的商品。但也请注意,这可能有多个答案,换句话说,可能有多个与您的条件匹配的键,这与使用字典的整个目的相矛盾。

演示:

In [11]: get_nested_item(tree, "George")
Out[11]: dict_values([{'Mickey'}])

In [12]: get_nested_item(tree, "Luke")
Out[12]: dict_values([{'The Chancellor'}])

In [13]: get_nested_item(tree, "Sarah")
No result

答案 2 :(得分:1)

这是一种变体,其中我使用<div style="float:left;"> <label for="phoneNumber">Home Phone</label> <div style="background:yellow; ">(<input style="width:20px;" type="tel" name="ext" id="phoneNumberExt" autocomplete="tel">) <input style="width:70%;" type="tel" name="phone" id="phoneNumber" autocomplete="tel"></div> </div>来获取next(iter(...))dict的“第一个”元素(请注意,{{1}中最里面的花括号是}是set,而不是tree):

set

因为dictdef get(tree, name): def first(seq): return next(iter(seq)) if name in tree: return first(first(tree[name].values())) else: return None print(get(tree=tree, name='Juan')) # 'Thompson' print(get(tree=tree, name='Jan')) # None set返回的类型)都是不可索引的(没有dict_values方法),我使用{ {3}},并使用iter获取第一个元素。