Python 根据元组列表中的第二个元素查找具有前5个唯一值的所有项

Python 根据元组列表中的第二个元素查找具有前5个唯一值的所有项,python,list,sorting,tuples,Python,List,Sorting,Tuples,我想根据元组的第二个元素,在元组列表中查找具有前5个最大值的所有元组项。 例如,我有一个元组列表 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个唯一值是9、8、5、4、3和a,b都有值5,因此它们都应包含在列表中 你知道如何实现这一点吗? 谢谢 x1=

我想根据元组的第二个元素,在元组列表中查找具有前5个最大值的所有元组项。 例如,我有一个元组列表

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个唯一值是9、8、5、4、3和a,b都有值5,因此它们都应包含在列表中

你知道如何实现这一点吗? 谢谢

x1=[('f',9),('e',8),('a',5),('b',5),('c',4),('d',3),('g',2),('h',1)]
x1.排序(key=lambda x:x[1],reverse=True)
max5set=set()
i=0
对于u1,x1中的num:
max5set.add(num)
i+=1
如果(len(max5set)==6):
打破
打印(x1[:i-1])
输出:

[('f', 9), ('e', 8), ('a', 5), ('b', 5), ('c', 4), ('d', 3)]
如果要按字母顺序获取此元组列表,请执行以下操作

打印(已排序(x1[:i-1],key=lambda x:x[0]))
输出将是

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

使用排序的
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)]
[('a', 5), ('b', 5), ('c', 4), ('d', 3), ('e', 8), ('f', 9)]
[('a', 5), ('b', 5), ('c', 4), ('d', 3), ('e', 8), ('f', 9)]
如果希望对最终输出进行排序,请再次使用
sorted

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

[('f', 9), ('e', 8), ('a', 5), ('b', 5), ('c', 4), ('d', 3)]
[('a', 5), ('b', 5), ('c', 4), ('d', 3), ('e', 8), ('f', 9)]
[('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
输出:

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

def my_-fun(x1,k):
将numpy作为np导入
x2=np.asarray(x1)#转换为numpy数组
val=np.unique(np.sort(x2[:,1]))[-k:]#排序索引1并查找前“k”个唯一值
idx=np.isin(x2[:,1],val)#要保留的行的索引
x2=x2[idx].tolist()
x2=列表(映射(元组,x2))#转换回元组列表
返回x2