Первый совет, который я могу дать, - это использовать значимые имена для ваших переменных.
Имея это в виду, вот решение, которое я предлагаю:
# just for a nice output
from pprint import pprint
def find_best_prices(products, vendors):
prices = {}
for product_code, product_name in products:
for vendor_product_code, vendor_phone, vendor_product_price in vendors:
if product_code not in prices:
prices[product_code] = {}
if product_code == vendor_product_code:
if prices[product_code]:
if prices[product_code]['price'] > vendor_product_price:
prices[product_code] = {
'vendor_price': vendor_product_price,
'vendor_phone': vendor_phone
}
else:
prices[product_code] = {
'vendor_price': vendor_product_price,
'vendor_phone': vendor_phone
}
return prices
products = [
['123456789', '2L 2% Vitali Milk'],
['123456798', '1L 2% Vitali Milk'],
['456392452', '70% Cocoa Zimbra Chocolate'],
['456123490', 'Zimbra Milk Chocolate'],
['634590221', 'Onion flavour chips'],
['634599011', 'Vinegar flavour chips'],
['780123678', 'Sliced white bread'],
['780432109', 'Sliced whole wheat bread'],
['809001234', '2L Orange Juice'],
['808765432', '2L Apple Juice']
]
vendors = [
['123456789', '7807890123', '2.58'],
['123456789', '7804922860', '2.99'],
['456392452', '7807890123', '2.11'],
['456123490', '7804922860', '3.10'],
['808765432', '7809876543', '4.10']
]
pprint(find_best_prices(products, vendors))
Приведенный выше код приведет к в следующем выводе:
{'123456789': {'vendor_phone': '7807890123', 'vendor_price': '2.58'},
'123456798': {},
'456123490': {'vendor_phone': '7804922860', 'vendor_price': '3.10'},
'456392452': {'vendor_phone': '7807890123', 'vendor_price': '2.11'},
'634590221': {},
'634599011': {},
'780123678': {},
'780432109': {},
'808765432': {'vendor_phone': '7809876543', 'vendor_price': '4.10'},
'809001234': {}}
Приведенный выше код имеет дело с галстуками в «первый раз видел, первый выиграл» logi c. Это означает, что если есть два vendors
с одним и тем же vendor_product_price
для одного и того же vendor_product_code
, в отчет попадает первый vendor
.
Чтобы изменить это поведение на "last видно, последний выигрывает ", замените >
на >=
в строке сравнения, которая гласит:
if prices[product_code]['price'] > vendor_product_price:
И, наконец, другая стратегия будет лишена дубликатов vendors
на основе vendor_product_price
, сохраняя минимальную цену, а затем свяжите products
с результирующим списком.
Вот реализация этой идеи:
def find_best_prices(products, vendors):
prices = {}
for product, phone, price in vendors:
if product not in prices:
prices[product] = {
'vendor_phone': phone,
'vendor_price': price
}
else:
if prices[product]['vendor_price'] > price:
prices[product] = {
'vendor_phone': phone,
'vendor_price': price
}
for product, _ in products:
if product not in prices:
prices[product] = {}
return prices
Существует много возможностей для улучшения, но это было оставлено специально. Я хочу быть дидактическим c, не эффективным.