我正在尝试获取元组列表中的最高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)
编辑:当谈到最低值时,我指的是元组第二个值中的最高值,然后,如果两个第二个值相同,则我要取两者中最低的第一个值。
答案 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)]