объединить два цикла для заполнения одного словаря - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь получить двух разных продавцов из списка словарей с приоритетом для торговцев, у которых есть цены, если не найдено двух разных продавцов с ценами, цены продавца 1 или 2 заполняются данными из списка, если списокнедостаточно торговца 1 или 2 должно быть Нет.

Т.е. цикл for вернет двух торговцев, приоритет для торговцев, у которых есть цены, если этого недостаточно для заполнения торговцев (1 или 2), получайте торговцев безЦены. Наконец, если торговец 1 или 2 еще не создан, заполните его значением None.

Вот код, который у меня есть, он выполняет свою работу, но я считаю, что он может быть объединен более Pythonic способом.

import csv
with open('/home/timmy/testing/example/example/test.csv') as csvFile:
    reader=csv.DictReader(csvFile)
    for row in reader:
        dummy_list.append(row)
item=dict()
index = 1
for merchant in dummy_list:
    if merchant['price']:
        if index==2:
            if item['merchant_1']==merchant['name']:
                continue
        item['merchant_%d'%index] = merchant['name']
        item['merchant_%d_price'%index] = merchant['price']
        item['merchant_%d_stock'%index] = merchant['stock']
        item['merchant_%d_link'%index] = merchant['link']
        if index==3:
            break
        index+=1

for merchant in dummy_list:
    if index==3:
        break
    if index<3:
        try:
            if item['merchant_1']==merchant['name']:
                continue
        except KeyError:
            pass
        item['merchant_%d'%index] = merchant['name']
        item['merchant_%d_price'%index] = merchant['price']
        item['merchant_%d_stock'%index] = merchant['stock']
        item['merchant_%d_link'%index] = merchant['link']
        index+=1

while index<3:
    item['merchant_%d'%index] = ''
    item['merchant_%d_price'%index] = ''
    item['merchant_%d_stock'%index] = ''
    item['merchant_%d_link'%index] = ''
    index+=1
print(item)

вот содержимое файла csv:

price,link,name,stock
,https://www.samsclub.com/sams/donut-shop-100-ct-k-cups/prod19381344.ip,Samsclub,
,https://www.costcobusinessdelivery.com/Green-Mountain-Original-Donut-Shop-Coffee%2C-Medium%2C-Keurig-K-Cup-Pods%2C-100-ct.product.100297848.html,Costcobusinessdelivery,
,https://www.costco.com/The-Original-Donut-Shop%2C-Medium-Roast%2C-K-Cup-Pods%2C-100-count.product.100381350.html,Costco,
57.99,https://www.target.com/p/the-original-donut-shop-regular-medium-roast-coffee-keurig-k-cup-pods-108ct/-/A-13649874,Target,Out of Stock
10.99,https://www.target.com/p/the-original-donut-shop-dark-roast-coffee-keurig-k-cup-pods-18ct/-/A-16185668,Target,In Stock
,https://www.homedepot.com/p/Keurig-Kcup-Pack-The-Original-Donut-Shop-Coffee-108-Count-110030/204077166,Homedepot,Undertermined

1 Ответ

0 голосов
/ 24 мая 2019

Поскольку вы хотите сохранить максимум 2 продавца, я бы обработал CSV только один раз, сохранив отдельно список торговцев с ценами и список торговцев без цен, остановившись, как только были найдены 2 торговца с ценами.

После этого цикла я бы объединил эти два списка и список двух пустых продавцов и взял бы первые два элемента этого. Этого будет достаточно, чтобы гарантировать ваши требования двух разных продавцов с приоритетом тех, кто имеет цены. Наконец, я бы использовал это, чтобы заполнить item dict.

Код будет:

import csv

with open('/home/timmy/testing/example/example/test.csv') as csvFile:
    reader=csv.DictReader(csvFile)

    names_price = set()
    names_no_price = set()
    merchant_price = []
    merchant_no_price = []
    item = {}

    for merchant in reader:
        if merchant['price']:
            if not merchant['name'] in names_price:
                names_price.add(merchant['name'])
                merchant_price.append(merchant)
                if len(merchant_price) == 2:
                    break;
        else:
            if not merchant['name'] in names_no_price:
                names_no_price.add(merchant['name'])
                merchant_no_price.append(merchant)

    void = { k: '' for k in reader.fieldnames}
    merchant_list = (merchant_price + merchant_no_price + [void, void.copy()])[:2]

    for index, merchant in enumerate(merchant_list, 1):
        item['merchant_%d'%index] = merchant['name']
        item['merchant_%d_price'%index] = merchant['price']
        item['merchant_%d_stock'%index] = merchant['stock']
        item['merchant_%d_link'%index] = merchant['link']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...