从字典中获取信息的最佳方式

时间:2016-03-16 08:21:12

标签: python dictionary

我有一个带有“多层”的词典(我真的不知道如何调用它),我只想使用它中的一些信息。所以直言不讳:

{'userTimestamp': 1, 
 'user': {'id': '20',
          'links': {'self': [{'href': 'https://john.com'}]},
          'mail': 'john@john.com',
          'message': 'Hello world',
          'name': 'john'}
}

现在我想以某种方式通过dict,获取相关信息(在这种情况下名称(在用户中),消息)并在新的dict中写入信息。在python中执行此操作的最有效方法是什么?

3 个答案:

答案 0 :(得分:1)

我建议如下:

new_dict = {}
new_dict["name"] = dict["user"]["name"]
new_dict["message"] = dict["user"]["message"]

答案 1 :(得分:0)

dict的重点是密钥查找是人类已知的最有效的方法。如果你知道你想要什么项目,就没有必要“通过”dict - 只需直接获取它们。

userdict = my_dict["user"]

这也适用于嵌套的dict,因为在每一步你都会再次回到纯dict - 这与外层效率一样高。

username = my_dict["user"]["name"]

为了从旧项目中创建一个新的dict,只需混合项目检索和字典创建。

my_new_dict = {
    'foo' : 'bar',
    'user_name' : my_dict["user"]["name"], # this will be 'john'
    'user_info' : my_dict["user"], # this will be the dict my_dict["user"]
    'user_meta' : {key: my_dict["user"][key] for key in ('name', 'mail')}, # this will be a subset of the dict my_dict["user"]
  }

答案 2 :(得分:0)

对于非常有活力的东西,我会使用类似的东西。

original_dict = {
    'name': "Rahul",
    'userTimestamp': 1,
    'user': {'id': '20',
             'links': {'self': [{'href': 'https://john.com'}]},
             'mail': 'john@john.com',
             'message': 'Hello world',
             'name': 'john'}
}

def get_dict_with_relevant_fields(orig_dict, interesting_fields):
    new_dict = {}
    for key, value in orig_dict.iteritems():
        if key in interesting_fields:
            new_dict[key] = value
        elif isinstance(value, dict):
            new_dict.update(get_dict_with_relevant_fields(value, interesting_fields))

    return new_dict

所以我可以这样打电话:

get_dict_with_relevant_fields(original_dict, ["id", "name"])

但是,如果您知道数据的确切结构以及有限字段的位置以及它们在结构中的位置。我总是喜欢这个:

new_dict = { 
    'name': original_dict['user']['name']
    'message': original_dict['user']['message']
}

更好的是,如果我已经拥有上面的效用函数,我将按如下方式使用它:

get_dict_with_relevant_fields(original_dict['user'], ['name', 'message'])

当然,我假设没有性能消耗,上述功能可以很容易地提高性能。