python排序列表的元组

时间:2014-04-01 01:31:30

标签: python list sorting tuples

我正在尝试排序元组列表。 例如,如果

>>>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中追加名称(字符串)。请帮忙!

3 个答案:

答案 0 :(得分:1)

您可以将密钥传递给已排序:

>>> 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根据他们的关键字(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

详细介绍了所有这些以及更多内容

答案 1 :(得分:1)

首先,听起来你想这样做:

给定(名称,分数)元组列表,返回名称列表 从最高分到最低分。

是吗?我会假设这是问题。

而不是进入你的代码(当我运行代码时,只返回其中一个(名称,分数)对,我会告诉你我是如何做到的。

首先是分开的步骤:

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 transform的变体。 (我猜我在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

如果您愿意,欢迎将其转换为功能。

干杯!

答案 2 :(得分:0)

我对排序主题的变化。我喜欢使用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
>>>