Python3-嵌套列表/字典迭代

时间:2019-07-09 12:54:04

标签: python-3.x

在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)

它工作得很好,但是看起来很复杂。有人会采用一种更简单,更易读的方法吗?

4 个答案:

答案 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'}