2014-10-19 57 views
1

我正在为销售iPhone配件的公司创建Python程序。该程序将具有一个函数,该函数接受列表的列表作为参数,其中每个列表元素包含描述产品的两个值 - 价格和估计质量(整数值)。我想找到一个项目的价格低于另一个的情况,但其质量高于另一个的情况。因此,例如,我将通过这个列表,我的功能:用于比较二维数组中元素的算法

some_inventory = [[11.95, 10], [7.95, 12], [6.50, 3],...] 

在这个列表中的元素[7.95,12]将有更低的价格和更高的质量比[11.95 10]。如果这种情况存在,我想返回一个布尔值,如good_deal = True。

some_inventory中有大约10万个这样的列表元素。我可以使用暴力方法将每个价格与所有其他价格进行比较,然后检查它们的质量,但这非常缓慢。我试着按价格先排序,对于价格相同的商品,我会消除质量较差的商品,并将最高品质的商品添加到新列表中(例如,如果有[4.50,2],[4.50,5] ,[4.50,8]我只添加了[4.50,8]到一个新列表中)。但这似乎仍然过于耗时。

是否有更高效的算法来进行这些比较?它不一定要用python,伪代码或者C/C++都可以。

+0

你能更具体地说明你想要这个算法做什么吗?它的行为如何?它会返回什么? – joshreesjones 2014-10-19 01:04:43

+0

@ mathguy54如果存在一种情况,产品比其他产品便宜但质量较高,我只希望程序返回布尔值,如good_deal = True。所以good_deal在开始时会被设置为False的默认值。 – MNRC 2014-10-19 01:06:48

+0

按质量先排序然后再打破价格最低的关系 – 2014-10-19 01:08:01

回答

1
def has_good_deal(deals): 
    return sorted(deals) != sorted(deals, key=lambda x: list(reversed(x))) 

表达的左侧排序由他们的价格优惠,而如果他们的价格是相等的,由它们的质量。表达式的右边按照它们的质量对交易进行排序,并且如果它们的质量相等,则按其价格排序。

如果排序不相等,则至少有两笔交易[p1, q1][p2, q2]已交换位置。如果他们换了地方,p1<p2q1>q2,这意味着[p1, q1][p2, q2]相比是一个很好的交易。如果种类相同,那就没有好处。

+0

我认为OP想要找到哪些交易是优惠交易,而不是在交易清单中有很多交易。 – Mephy 2014-10-19 01:35:16

+0

@Mephy OP指出,“我只是想让程序返回一个布尔值”。 – Joshua 2014-10-19 01:37:04

+0

这工作完美!我只是设置了good_deal = has_good_deals(交易)。你能解释一下你如何得到这个?我明白,在回报表达式的左边,你只是按照我假设的价格排序交易,但是在右边排序的是什么? – MNRC 2014-10-19 01:44:58