2014-01-30 31 views
4

我試圖找到元組中的元組的名單,但沒有得到該怎麼做查找元組

我有以下list (id, price, count)

[('1', 3.0, 6), ('2', 2.0, 2), ('3', 2.0, 5), ('4', 4.0, 2), ('5', 2.0, 5), (' 
6', 3.0, 6), ('7', 3.0, 5), ('8', 2.0, 5), ('9', 3.0, 5), ('10', 3.0, 5)] 

找到元組的條件是:

  1. 元組應該有最小值price
  2. 元組應該有最大數量value
  3. 第一條件的優先級高於第二條件。

請告訴我如何實現這些條件來查找列表中的元組。

回答

1

您可以從列表中的兩個元素建立sorted鍵:(price, -count)減去用於反轉方向計 - 更大的價值將首先在結果):

t = [('1', 3.0, 6), ('2', 2.0, 2), ('3', 2.0, 5), ('4', 4.0, 2), ('5', 2.0, 5), 
    ('6', 3.0, 6), ('7', 3.0, 5), ('8', 2.0, 5), ('9', 3.0, 5), ('10', 3.0, 5)] 

>>> sorted(t, key=lambda i: (i[1], -i[2])) 
[('3', 2.0, 5), ('5', 2.0, 5), ('8', 2.0, 5), ('2', 2.0, 2), ('1', 3.0, 6), 
('6', 3.0, 6), ('7', 3.0, 5), ('9', 3.0, 5), ('10', 3.0, 5), ('4', 4.0, 2)] 

要查找只有一個元素您可以使用min函數相同的元組的主要論點:

>>> min(t, key=lambda i: (i[1], -i[2])) 
('3', 2.0, 5) 
+0

我會感激,如果你添加一些解釋。 –

+0

它按照你想要的方式對元組進行排序。拿起第一個。 – luxcem

+0

您是如何確定我[1]將優先於-i [2]的? –

0

您可以通過在Python docs提到的方法多鍵排序。

x = [('1', 3.0, 6), ('2', 2.0, 2), ('3', 2.0, 5), ('4', 4.0, 2), ('5', 2.0, 5), 
    ('6', 3.0, 6), ('7', 3.0, 5), ('8', 2.0, 5), ('9', 3.0, 5), ('10', 3.0, 5)] 

排序第二優先級鍵count第一:

x1 = sorted(x, key=lambda t: t[2], reverse=True) 

然後,通過第一密鑰「price`結果進行排序:

x2 = sorted(x1, key=lambda t: t[1]) 

現在最佳的元組的第一個元素x2。查找X2相匹配的最優值的所有值:

optimal = (x2[0][1], x2[0][2]) 
[v for v in x2 if v[1]==optimal[0] and v[2]==optimal[1]] 
# -> [('3', 2.0, 5), ('5', 2.0, 5), ('8', 2.0, 5)] 
+0

爲什麼你使用'sorted'兩次?使用它來獲得'x1',然後調用'x1.sort'來避免列表的其他副本。 – Bakuriu

+0

我更喜歡以不可變的方式處理列表。使用「排序」思想沒有錯。 – arocks

2

您可以利用min/max內置功能來搜索您的瓷磚。無論他們會工作,其唯一的,你需要改變使用了另一種

對於數值的關鍵功能,否定的值改變其順序

a > b -> -a < -b。使用這些知識,您可以將鍵構建爲兩個元素的元組,順序取決於優先級的順序。根據你是否使用最大/最小,你需要否定適當的變量,

>>> min(t, key = lambda e: (e[1], -e[2])) 
('3', 2.0, 5) 
>>> max(t, key = lambda e: (-e[1], e[2])) 
('3', 2.0, 5)