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