Найти все элементы с 5 лучшими уникальными значениями на основе 2-го элемента в списке кортежей

Я хочу найти все элементы кортежа с 5 максимальными значениями в списке кортежей на основе 2-го элемента кортежа. Например, у меня есть список кортежей

x1 = [(a, 5), (b, 5), (c, 4), (d, 3), (e, 8), (f, 9), (g, 2), (h, 1)]

Я хочу получить следующий список:

x2 = [(a, 5), (b, 5), (c, 4), (d, 3), (e, 8), (f, 9)]

Поскольку первые 5 уникальных значений для 2-го элемента — это 9, 8, 5, 4, 3, а a, b оба имеют значение 5, они оба должны быть включены в список.

Любая идея о том, как это реализовать? Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
278
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

x1 = [('f', 9), ('e', 8), ('a', 5), ('b', 5), ('c', 4), ('d', 3), ('g', 2), ('h', 1)]
x1.sort(key=lambda x: x[1], reverse=True)
max5set = set()
i = 0
for _, num in x1:
    max5set.add(num)
    i += 1
    if (len(max5set) == 6):
        break
print(x1[:i-1])

выход:

[('f', 9), ('e', 8), ('a', 5), ('b', 5), ('c', 4), ('d', 3)]

если вы хотите получить этот список кортежей в алфавитном порядке, выполните

print(sorted(x1[:i-1], key=lambda x: x[0]))

вывод будет

[('a', 5), ('b', 5), ('c', 4), ('d', 3), ('e', 8), ('f', 9)]

Используя sorted и itertools.groupby:

import itertools

func = lambda x:x[1]
res = []
n_max = 5
group_by = itertools.groupby(sorted(x1, key=func, reverse=True), key=func)
for _ in range(n_max):
    res.extend(list(next(group_by)[1]))

Выход:

[('f', 9), ('e', 8), ('a', 5), ('b', 5), ('c', 4), ('d', 3)]

Если вы хотите, чтобы конечный результат был отсортирован, используйте sorted еще раз:

sorted(res, key=lambda x:x[0])

Выход:

[('a', 5), ('b', 5), ('c', 4), ('d', 3), ('e', 8), ('f', 9)]
Ответ принят как подходящий

Найдите первые 5 секундных элементов:

i = set(list({x[1] for x in x1})[-5:])

Отфильтровать список:

x2 = list(filter(lambda x: x[1] in i, x1))

Или еще лучше:

ss = {x[1] for x in x1}
if len(ss) > 5:
    i = list(ss)[-5]
    x2 = list(filter(lambda x: x[1] >= i, x1))
else:
    x2 = x1

Выход:

[('a', 5), ('b', 5), ('c', 4), ('d', 3), ('e', 8), ('f', 9)]

Использование numpy:

def my_fun(x1, k):
    import numpy as np

    x2 = np.asarray(x1)                         # Convert to numpy array
    val = np.unique(np.sort(x2[:,1]))[-k:]      # Sort index 1 & find top 'k' unique values
    idx = np.isin(x2[:,1], val)                 # Indices of rows to retain

    x2 = x2[idx].tolist()
    x2 = list(map(tuple, x2))                   # Convert back to list of tuples
    return x2
>>> x1 = [('a', 5), ('b', 5), ('c', 4), ('d', 3), ('e', 8), ('f', 9), ('g', 2), ('h', 1)]

>>> my_fun(x1, 5)
[('a', '5'), ('b', '5'), ('c', '4'), ('d', '3'), ('e', '8'), ('f', '9')]

>>> my_fun(x1, 3)
[('a', '5'), ('b', '5'), ('e', '8'), ('f', '9')]

Другие вопросы по теме