2014-10-19 106 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