根据值选择dict对象

时间:2016-09-28 15:18:59

标签: python

这就是我的JSON对象的样子:

[{
    'Description': 'Description 1',
    'OutputKey': 'OutputKey 1',
    'OutputValue': 'OutputValue 1'
},
{
    'Description': 'Description 2',
    'OutputKey': 'OutputKey 2',
    'OutputValue': 'OutputValue 2'
},
{
    'Description': 'Description 3',
    'OutputKey': 'OutputKey 3',
    'OutputValue': 'OutputValue 3'
},
{
    'Description': 'Description 4',
    'OutputKey': 'OutputKey 4',
    'OutputValue': 'OutputValue 4'
},
{
    'Description': 'Description 5',
    'OutputKey': 'OutputKey 5',
    'OutputValue': 'OutputValue 5'
},
{
    'Description': 'Description 6',
    'OutputKey': 'OutputKey 6',
    'OutputValue': 'OutputValue 6'
}]

如何在没有循环的情况下获取OutputKey为4的dict对象?

any(key['OutputKey'] == 'OutputKey 4' for key in myJSON)返回true但我需要它来获取属于该键的整个JSON对象。

5 个答案:

答案 0 :(得分:5)

您可以使用next

next(key for key in myJSON if key['OutputKey'] == 'OutputKey 4')

然而,如果"键"没有出现,那么您将获得StopIteration例外。你可以处理它,因为你通常会处理任何其他异常,或者你可以提供"默认"到next

default = None  # or whatever...
next((key for key in myJSON if key['OutputKey'] == 'OutputKey 4'), default)

请注意,这仍然是"循环播放"所有项目(除非它找到合适的项目时短路)。如果你真的想避免循环,你需要一个不同的数据结构:

dict_by_output_key = {key['OutputKey']: key for key in myJSON}
dict_by_output_key['OutputKey 4']

你仍然需要做一个循环 - 但是一旦你完成它,你可以做任意多次的O(1)查找。成本是一点额外的中间存储(内存)。

答案 1 :(得分:1)

try:
    next(key for key in myJSON if key['OutputKey'] == 'OutputKey 4')
except StopIteration:
    #code for the case where there is no such dictionary

答案 2 :(得分:0)

JSON对象本质上是一个字典列表。因此,您需要使用索引表示法来访问其中一个词典,在本例中为myJSON [3]。然后在字典中,调用该字典的键,以便它返回其值。所以:

myJSON[3]['OutputKey']

将返回OutputKey4。

答案 3 :(得分:0)

你有一个dicts列表。如果您知道所需dict的索引,那么您可以索引该列表:

output_4 = myJSON[3]

否则,即使循环不明显(与any方法一样),您也会循环播放:

for d in myJSON:
    if d['OutputKey'] == 'OutputKey 4':
        result = d
        break

答案 4 :(得分:0)

也许您应该考虑使用某种内存数据库存储信息,以便对您的数据执行此类查询。

例如,我过去使用过TinyDB,它以JSON格式将数据保存在文件中。这是使用此模块的请求查询的代码:

from tinydb import TinyDB, Query
from tinydb.storages import MemoryStorage
db = TinyDB(storage=MemoryStorage)

db.insert_multiple([{
    'Description': 'Description 1',
    'OutputKey': 'OutputKey 1',
    'OutputValue': 'OutputValue 1'
},
{
    'Description': 'Description 2',
    'OutputKey': 'OutputKey 2',
    'OutputValue': 'OutputValue 2'
},
{
    'Description': 'Description 3',
    'OutputKey': 'OutputKey 3',
    'OutputValue': 'OutputValue 3'
},
{
    'Description': 'Description 4',
    'OutputKey': 'OutputKey 4',
    'OutputValue': 'OutputValue 4'
},
{
    'Description': 'Description 5',
    'OutputKey': 'OutputKey 5',
    'OutputValue': 'OutputValue 5'
},
{
    'Description': 'Description 6',
    'OutputKey': 'OutputKey 6',
    'OutputValue': 'OutputValue 6'
}])

q = Query()
print db.search(q.OutputKey == 'OutputKey 4')