在元组列表中查找元组(按多个键排序)

时间:2014-01-30 10:03:18

标签: python list

我试图在元组列表中找到元组,但没有得到如何做到这一点

我有以下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. 第一个条件的优先级高于第二个条件。
  4. 请告诉我如何在列表中找到元组来实现这些条件。

3 个答案:

答案 0 :(得分:2)

您可以利用min / max内置功能搜索您的磁贴。它们中的任何一个都可以工作,只有你需要更改键功能才能使用其中一个

对于数值,否定值会改变其顺序

a > b -> -a < -b。使用这些知识,您可以将密钥构建为两个元素的元组,顺序取决于优先级顺序。根据您是否使用max / min,您需要否定适当的变量,

>>> 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)

答案 1 :(得分: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)

答案 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)]