[英]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.