[英]python sort list of tuple
我正在尝试对元组列表进行排序。 例如,如果
>>>recommendations = [('Gloria Pritchett', 2), ('Manny Delgado', 1), ('Cameron Tucker', 1), ('Luke Dunphy', 3)]
我想得到
Luke Dunphy
Gloria Pritchett
Cameron Tucker
Manny Delgado
这就是我所做的:
这段代码只给了我
>>> [('Luke Dunphy', 3), ('Gloria Pritchett', 2), ('Cameron Tucker', 1), ('Manny Delgado', 1)]
我不知道如何在 sorted_list 中只附加名称(字符串)。 请帮忙!
您可以将键传递给 sorted:
>>> s = sorted(recommendations, key=lambda x: x[1], reverse=True)
[('Luke Dunphy', 3), ('Gloria Pritchett', 2), ('Manny Delgado', 1), ('Cameron Tucker', 1)]
然后获取名称:
names = [x[0] for x in s]
# ['Luke Dunphy', 'Gloria Pritchett', 'Manny Delgado', 'Cameron Tucker']
如果您已经注意到,Manny Delgado 和 Cameron Tucker 基于他们的 key(1) 并列,但 Manny Delgado 排在 Cameron Tucker 之前,因为 Python 排序是就地的。 但是,根据所需的输出,您希望使用辅助键(在本例中为名称)解析主键中的关系。 您可以先按名称排序,然后由主整数键排序做到这一点:
t = sorted(recommendations, key=lambda x: x[0])
s = sorted(t, key=lambda x: x[1], reverse=True)
# [('Luke Dunphy', 3), ('Gloria Pritchett', 2), ('Cameron Tucker', 1), ('Manny Delgado', 1)]
请注意,Cameron Tucker 现在排在 Manny Delgado 之前。 所有这些以及更多内容都在优秀的Sorting Howto中详细介绍
首先,听起来你想这样做:
给定一个 (name, score) 元组列表,返回一个从最高分到最低分的名称列表。
那正确吗? 我假设这就是问题所在。
而不是进入你的代码(当我运行它时,只返回一个(名称,分数)对,我会告诉你我是如何做的。
首先在单独的步骤中:
recommendations = [
('Gloria Pritchett', 2),
('Manny Delgado', 1),
('Cameron Tucker', 1),
('Luke Dunphy', 3)]
rec2 = [(age, name) for name, age in recommendations]
print rec2
rec3 = sorted(rec2, reverse=True)
print rec3
rec4 = [name for age, name in rec3]
print rec4
这将打印:
[(2, 'Gloria Pritchett'), (1, 'Manny Delgado'), (1, 'Cameron Tucker'), (3, 'Luke Dunphy')]
[(3, 'Luke Dunphy'), (2, 'Gloria Pritchett'), (1, 'Manny Delgado'), (1, 'Cameron Tucker')]
['Luke Dunphy', 'Gloria Pritchett', 'Manny Delgado', 'Cameron Tucker']
这就是你要找的吗? 就我而言,“Manny”在“Cameron”之前排序(与您预期的答案不同),但如果他们的分数相同,我希望这对您来说无关紧要。 (如果是这样,请澄清您的问题)
像我这样的老前辈可能会称其为Schwartzian 变换的变体。 (我猜我在 Perl 中的根源正在显示......)
无论如何,这是它的工作原理:
rec2
是一个“列表理解”,分数和名称交换了。
rec3
使用 Python 的内置功能对元组进行排序,但使用reversed=True
来获得从高到低的排序。
rec4
是另一种“列表理解”,可以删除分数并返回名称。
如果必须,您可以将所有内容放在一个语句中:
class_rank = [name for age, name in sorted([(age, name) for name, age in recommendations], reverse=True)]
print class_rank
如果您愿意,欢迎您将其转换为函数。
干杯!
我对排序主题的变体。 我喜欢使用 itemgetter:
>>>
>>> from operator import itemgetter
>>> name = itemgetter(0)
>>> score = itemgetter(1)
>>> recommendations = [('Gloria Pritchett', 2), ('Manny Delgado', 1), ('Cameron Tucker', 1), ('Luke Dunphy', 3)]
>>> print '\n'.join(map(name, sorted(recommendations, key = score, reverse = True)))
Luke Dunphy
Gloria Pritchett
Manny Delgado
Cameron Tucker
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.