Создайте сложный словарь с помощью try и except - PullRequest
2 голосов
/ 09 июля 2020
• 1000 1003 *
result_box_lst = [{
            "coordinates": box['boundingPoly']['normalizedVertices'], 
            "product": [{
                "product_name"  : product["product"]["name"],
                "product_uri"   : product["product"]["img_uri"],
                "price"         : product["product"]["product_price"],
###################### problematic area #############################################
                "product_label1": product["product"]["productLabels"][1]["value"],
                "product_label2": product["product"]["productLabels"][2]["value"],
                "product_label3": product["product"]["productLabels"][3]["value"],
######################################################################################
                "score"         : product["score"]
                } for product in box['results'] if product["score"] >  0.25]
        } for box in grouped_results]

Здесь проблема в том, что иногда product["product"]["productLables"] не имеет нескольких элементов в списке, поэтому понимание списка вылетает с исключением IndexOutofRange. Итак, я подумал о том, чтобы поймать это с помощью try and except и погуглил, но, увы, в списках не может быть try/except внутри.

Таким образом, я начал кодировать в основном c способе для l oop и застрял, задаваясь вопросом, как я могу создать такую ​​же структуру сложного словаря / списка, используя базовую c форму для l oop. Пока что я построил это:

result_box_lst = []
product = []
        for box in grouped_results:
            for product in box['results']:
                if product["score"] >  0.25:
                    try:

                    products.append({
                        "product_name": product["product"]["name"],
                        "product_uri"   : product["product"]["img_uri"],
                        "price"         : product["product"]["product_price"],
                        "product_label1": product["product"]["productLabels"][1]["value"],
                        "product_label2": product["product"]["productLabels"][2]["value"],
                        "product_label3": product["product"]["productLabels"][3]["value"],
                        "score"         : product["score"]
                    })

                    except:
                    pass

Однако я совершенно уверен, что это никогда не достигнет того, что я sh. Есть ли способ сделать такой сложный словарь / список с этим для l oop?

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Вы можете попробовать что-то вроде этого:

for box in grouped_results:
    for product in box['results']:
        if product["score"] >  0.25:
            data = {
                "product_name": product["product"]["name"],
                "product_uri"   : product["product"]["img_uri"],
                "price"         : product["product"]["product_price"],
                "score"         : product["score"]
            }
            for i in range(1,4):
                if i < len(product["product"]["productLabels"]):
                    data['product_label{}'.format(i)] = product["product"]["productLabels"][i]["value"]
                else:
                    data['product_label{}'.format(i)] = "Some default value"
            products.append(data)

Но обратите внимание, что массив начинается с 0, поэтому вам может потребоваться немного изменить в зависимости от вашего случая

2 голосов
/ 09 июля 2020

Это очень сложное понимание, поэтому for l oop может оказаться более читабельным и удобным в обслуживании. Но если ваша единственная проблема заключается в том, что иногда индексы вашего списка выходят за границы, вы можете справиться с этим с помощью if / else:

"product_label2": product["product"]["productLabels"][2]["value"] if len(product["product"]["productLabels"]) > 2 else "",
"product_label3": product["product"]["productLabels"][3]["value"] if len(product["product"]["productLabels"]) > 3 else ""

Кроме того, вы намеренно использовали индексы [1] [2] [3] вместо [0] [1] [2]? Просто проверяю ...

...