Как получить 4 самых высоких значения кортежа?

#python #tuples

#python #Кортежи

Вопрос:

Я пытаюсь получить 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)
 

Редактировать: когда речь идет о наименьшем значении, я имею в виду наибольшее значение во втором значении кортежа, а затем, если два вторых значения совпадают, я хочу взять наименьшее первое значение из двух.

Комментарии:

1. разве это не (67,10) самое высокое значение в приведенном выше кортеже?

2. Что вы имеете в виду под «наивысшими 4»? Если два tuples имеют одинаковые значения, то ни одно из них не может быть ниже…

3. if there are two tuples with the same value — Вы имеете в виду if there are two tuples with the same second value ?

4. @pistol2myhead да, это правильно, я имею в виду два кортежа с одинаковым вторым значением.

5. @gmds если два кортежа имеют одинаковое второе значение, я хочу взять тот, у которого наименьшее первое значение.

Ответ №1:

Как насчет 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 , мы берем четыре верхние группы и сортируем каждую по значению первого элемента в порядке возрастания. Принимая первое значение каждой группы, мы получаем наш ответ.

Ответ №2:

Вы можете попробовать это :

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