根据键

时间:2019-03-26 16:03:28

标签: python

我有一个字典列表,需要根据键的值从值的子字典中获取int_value。

my_list = [{'key': 'previous_id',
  'value': {'int_value': '-4343583665607944462'}},
 {'key': 'event_origin', 'value': {'string_value': 'auto'}},
 {'key': 'screen_id', 'value': {'int_value': '-5880567181845583757'}},
 {'key': 'previous_class', 'value': {'string_value': 'MainActivity'}},
 {'key': 'screen', 'value': {'string_value': 'Gateway'}},
 {'key': 'screen_class', 'value': {'string_value': 'Gateway'}}]

例如,我需要获取-4343583665607944462作为previous_id的字符串输出。

这是我到目前为止所看到的,对我来说看起来很复杂,想知道是否有更简单的方法来实现这一目标。

for d in my_list:
    if list(d.values())[0] == 'previous_id':
        print(list(d.values())[1].values())

获取-4343583665607944462作为previous_id的字符串输出。

请还建议定义一个函数是否有意义。

4 个答案:

答案 0 :(得分:1)

我建议通过使用"previous_id"而不是"key"来检查第一个值是否为.values()[0],并获取值。如果您提前知道键,这是从字典访问数据的推荐方法。

如果您想简化代码,可以使用next函数,该函数循环遍历可迭代对象并返回找到的第一个值(如果存在,则匹配给定条件)。

例如:

value = next(d["value"] for d in my_list if d["key"] == "previous_id")

这将返回

{'int_value': '-4343583665607944462'}

如果只需要"-4343583665607944462",则可以:

value = next(list(d["value"].values())[0] for d in my_list if d["key"] == "previous_id")

请注意,此处使用.values()[0]是因为键并不总是相同。

如果next到达可迭代对象的末尾但没有找到匹配项,也会引发StopIteration异常,因此请考虑将其包装在try / except块中。

答案 1 :(得分:1)

可能值得花些时间来处理字典的初始列表,例如:

key_to_int = {}
for d in my_list:
    if 'int_value' in d['value']:
        key_to_int[d['key']] = d['value']['int_value']
    else:
        key_to_int[d['key']] = None

然后您可以简单地做:

print(key_to_int['previous_id'])
print(key_to_int['event_origin'])
print(key_to_int['screen_id'])

哪个输出:

-4343583665607944462
None
-5880567181845583757

以上假设您的所有字典都采用相同的格式。如果某些词典的嵌套程度可能比其他词典高,则需要进行一些修改。

答案 2 :(得分:0)

我不知道您是否有权事先修改实际列表,但是将值的类型保留在单个字典中可能更有意义,例如:

my_list = [{
    'key': 'previous_id',
    'value': '-4343583665607944462',
    'type': 'int_value' },...]

这样,您可以简单地致电:

for dict in my_list:
    if dict['key']=='previous_id':
        return dict['value']

或单线:

value = [x['values'] for x in my_list if x['key']=='previous_id']

如果您热衷于使用值类型

value = {x['type']:x['values'] for x in my_list if x['key']=='previous_id'}

答案 3 :(得分:0)

如果您想使用相同的词典并坚持使用您的方法,则可以使用:

for d in my_list:
    if d["key"] == 'previous_id':
        print(list(d["value"].values())[0])

但是建议您使用这样的字典:

my_dict = {"previous_id": '-4343583665607944462', 'event_origin':'auto',  
    'screen_id':-5880567181845583757,  'previous_class': 'MainActivity',
    'screen': 'Gateway',  'screen_class': 'Gateway'}

然后您可以像这样简单地使用打印:

print(my_dict["previous_id"])