<p>我能给你们的第一个建议是对变量使用有意义的名称</p>
<p>考虑到这一点,我提出以下解决方案:</p>
<pre class="lang-py prettyprint-override"><code># 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))
</code></pre>
<p>上述代码将产生以下输出:</p>
<pre class="lang-py prettyprint-override"><code>{'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': {}}
</code></pre>
<p>上面的代码处理<em>逻辑中的<em>关系</em>“先见先赢”</em>。这意味着,如果有两个<code>vendors</code>具有相同的<code>vendor_product_price</code>用于相同的<code>vendor_product_code</code>,则第一个<code>vendor</code>出现在报告中</p>
<p>要将该行为更改为“最后一次看到,最后一次赢”</em>,请将比较行中的<code>></code>替换为<code>>=</code>,如下所示:</p>
<p><code>if prices[product_code]['price'] > vendor_product_price:</code></p>
<p>最后,另一种策略是基于<code>vendor_product_price</code>消除重复<code>vendors</code>,保持最低价格,然后将<code>products</code>与结果列表关联</p>
<p>以下是这一想法的实施情况:</p>
<pre class="lang-py prettyprint-override"><code>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
</code></pre>
<p>有很大的改进空间,但这是故意留下来的。我愿意说教,而不是讲求效率</p>