我正在尝试排序元组列表。 例如,如果
>>>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中追加名称(字符串)。请帮忙!
答案 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
>>>