2017-09-03 109 views
2

我收到一个JSON字典,并且我想检查某些键是否存在并且是真的检查项目是否在字典中,并且使用Python是否为真

我检查他们是否使用all(i in incoming_json for i in ['title', 'code', 'university', 'lecturer']),但我坚持检查它们是否属实。

我试过all(i in incoming_json and True for i in ['title', 'code', 'university', 'lecturer'])all(i in incoming_json for i in ['title', 'code', 'university', 'lecturer'] if i),但他们似乎没有任何区别。

我在做什么错?

例JSON:

{title: "Example title", code: "1234", university: "2", lecturer: "John Doe"}

澄清:我只需要知道,如果他们truthy或falsy。

编辑:谢谢你的回复,我可以接受他们中的任何一个,但我接受了解释我做错了什么的。

+0

包括你recieving –

回答

5

and True只是检查..好吧,没什么,因为TrueTruei in incoming_json and incoming_json[i]将检查incoming_json中代表的密钥值是否也为真(或评估值为True)。

如果您确实想要检查布尔值True(而不是1等),请使用incoming_json[i] is True

+0

我得到了很多优秀的响应JSON,但这个回答我的问题是最好的。 – km6

1

你可以试试这个:

l = ['title', 'code', 'university', 'lecturer'] 
d = {title: "Example title", code: "1234", university: "2", lecturer: "John Doe"} 

new_l = [i for i in l if i in d and d[i]] 
+1

'和i'正在测试这些密钥,并且OP想要测试这些值。 – DSM

+0

@DSM请看我最近的编辑。 – Ajax1234

+1

该列表理解是..不太可读。 :-) – MatsLindh

4

您可以简单地使用incoming_json.get(i)将返回键或None的值,如果它不为以下存在:

all(incoming_json.get(i) for i in ['title', 'code', 'university', 'lecturer']) 

这将返回False只有当字典中不存在该值或者该值为False

+0

或者只是'incoming_json.get(i)',因为'None'是虚假的。 – ekhumoro

+0

@ekhumoro True :-) –

1

您可以使用此:

incoming_json = {"title": "Example title", "code": "1234", "university": "2", "lecturer": "John Doe"} # the json 

keys = ['title', 'code', 'university', 'lecturer'] # the keys 

test = all(i in incoming_json and incoming_json[i] for i in keys) # if key in json keys and it's truthy 

print(test) # True 
+0

我不知道我关注。 'all'和'and'短路。为什么添加三个'not's? – DSM

+0

@DSM是的,我记得读到,因为所有和任何函数,无论如何所有的参数将被评估,所以任何或全部,只是相同。 –

1

你可以尝试这样的:

all(incoming_json[i] if i in incoming_json else False for i in ['title', 'code', 'university', 'lecturer']) 
相关问题