如何获得最高的4个元组值?

时间:2019-04-18 08:22:01

标签: python tuples

我正在尝试获取元组列表中的最高4个值,并将它们放入新列表中。但是,如果有两个具有相同值的元组,我想取一个具有最低编号的元组。

列表最初看起来像这样:

[(9, 20), (3, 16), (54, 13), (67, 10), (2, 10)...]

我希望新列表看起来像这样:

[(9,20), (3,16), (54, 13), (2,10)]

这是我当前的代码有什么建议吗?

sorted_y = sorted(sorted_x, key=lambda t: t[1], reverse=True)[:5]
sorted_z = []
while n < 4:
    n = 0
    x = 0
    y = 0
    if sorted_y[x][y] > sorted_y[x+1][y]:
        sorted_z.append(sorted_y[x][y])
        print(sorted_z)
        print(n)
        n = n + 1
    elif sorted_y[x][y] == sorted_y[x+1][y]:
        a = sorted_y[x]
        b = sorted_y[x+1]
        if a > b:
            sorted_z.append(sorted_y[x+1][y])
        else:
            sorted_z.append(sorted_y[x][y])
        n = n + 1
        print(sorted_z)
        print(n)

编辑:当谈到最低值时,我指的是元组第二个值中的最高值,然后,如果两个第二个值相同,则我要取两者中最低的第一个值。

2 个答案:

答案 0 :(得分:0)

groupby怎么样?

from itertools import groupby, islice
from operator import itemgetter

data = [(9, 20), (3, 16), (54, 13), (67, 10), (2, 10)]
pre_sorted = sorted(data, key=itemgetter(1), reverse=True)

result = [sorted(group, key=itemgetter(0))[0] for key, group in islice(groupby(pre_sorted, key=itemgetter(1)), 4)]
print(result)

输出:

[(9, 20), (3, 16), (54, 13), (2, 10)]

说明:

这首先按第二个元素的值对数据进行降序排序。 groupby然后将它们分组,该组中的每个tuple的第二个元素都具有相同的值。

使用islice,我们将排名前四的组按照 first 元素的值按升序排序。取每个组的第一个值,我们得出答案。

答案 1 :(得分:0)

您可以尝试以下方法:

l = [(9, 20), (3, 16), (54, 13), (67, 10), (2, 10)]
asv = set([i[1] for i in l])  # The set of unique second elements
new_l = [(min([i[0] for i in l if i[1]==k]),k) for k in asv]

输出

[(3, 16), (2, 10), (9, 20), (54, 13)]