簡體   English   中英

元組的python排序列表

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM