在mongodb请求之后,我得到了这样的文档:
a = [{"name": 'Aspirin', "Dates": [{'Qty': 50, 'Date':'2019-07-09'}, {'Qty': 10, 'Date': '2020-05-19'}]}]
我想检索与日期 2019-07-09 相关的数量 50 。这是我的工作方式:
old_qte = None
for i in a:
for key, value in i.items():
if value == 'Aspirin':
for k, v in i.items():
if k == 'Dates':
for z in v:
for x, y in z.items():
if y == '2019-07-09':
old_qte = z
print(old_qte['Qty'], old_qte)
它工作得很好,但是看起来很复杂。有人会采用一种更简单,更易读的方法吗?
答案 0 :(得分:2)
您可以使用dict理解将结果重新格式化为更易于访问的dict(名称->日期->数量)
a = [{"name": 'Aspirin', "Dates": [{'Qty': 50, 'Date': '2019-07-09'}, {'Qty': 10, 'Date': '2020-05-19'}]}]
d = {entry["name"]: {inner["Date"]: inner["Qty"] for inner in entry["Dates"]} for entry in a}
print(d)
print(d["Aspirin"]["2019-07-09"])
答案 1 :(得分:2)
这将使您一站式到达:
next(date for date in a[0]['Dates'] if date['Date'] == '2019-07-09')['Qty']
#50
仅获取满足条件的第一个条件并从中获取Qty
。
答案 2 :(得分:1)
看起来像您需要的。
a = [{"libelle": 'Aspirine', "Dates": [{'Qte': 50, 'Date':'2019-07-09'}, {'Qte': 10, 'Date': '2020-05-19'}]}]
old_qte = None
for i in a:
if 'Aspirine' in i.values():
for j in i["Dates"]:
if j["Date"] == '2019-07-09':
old_qte = j["Qte"]
break
print(old_qte)
答案 3 :(得分:1)
您可以使用数据管道,先过滤Aspirin
,然后检查日期:
# select 'Aspirin'
r1 = (dct for dct in a if dct["name"] == "Aspirin")
# unpack 'Dates' lists
r2 = (date for item in r1 for date in item["Dates"])
# select date
r3 = (dct for dct in r2 if dct["Date"] == "2019-07-09")
next(r3) # {'Qty': 50, 'Date': '2019-07-09'}