2015-12-22 174 views
0

假設我有一個txt文件,每行都包含名稱和年齡(名稱始終唯一,但年齡可以相同)。基於屬性的排序對象

任何人都可以提出一個很好的算法來打印出他們的年齡是在升序/降序的名稱?

感謝

+0

你可以給我們一個你的文件的例子,你到目前爲止嘗試了什麼? –

+0

問題是通過所述元組的第二個元素讀取文件中的元素還是排序元組列表? – timgeb

+0

如果你提供了一些嘗試,你會得到一個很好的答案 –

回答

2

謝謝,這個問題是排序。假設我們有(a,10),(b,5),(c,11)。 (c,11),(a,10),(b,5)

好吧,我假設你有這些元組列表中的元組。您可以使用內置的sorted函數,併爲其指定一個按鍵函數,該函數指定您的列表元素的排序屬性。

>>> people = [('bob', 28), ('alice', 21), ('jeff', 78)] 
>>> sorted(people, key=lambda tup: tup[1], reverse=True) 
[('jeff', 78), ('bob', 28), ('alice', 21)] 

這裏lambda tup: tup[1]將返回每個元組的第二元件。這是元組將被排序的值。 reverse=True設置爲按降序對元組進行排序。

+2

使用operator.itemgetter或operator.attrgetter而不是lambda。 (attrgetter,如果它是一個namedtuple)。它更習慣,也更快。 –

+0

@AlexanderHuszagh爲什麼我需要導入這樣一項微不足道的任務? – timgeb

+1

因爲這是內建庫的點。當然,你可以寫一個lambda,但是itemgetter是特定的,它很有用,而且速度也快了50%。 –

1

如果你把名字/在喜歡的東西(字典青睞將取決於你的實際文件格式(具有相同的年齡不需要保留訂單在TXT人名) - 以下假定一個名稱,然後年齡在每一行上,用空格分隔):

names = {} 
with open('file.txt') as f: 
    for line in f: 
     name, age = line.split() 
    names[name] = int(age) 

那麼很容易進行排序 - 由名字(你建議沒有什麼排序,只是FYI),用途:

sorted(names) 

要按年齡排序,改變用來做排序的關鍵是:

sorted(names, key=lambda i: names[i]) 

所以,要打印,您可以使用:

for name in sorted(names, key=lambda i: names[i]): 
    print(name, names[name]) 
4

timegeb給出的the answer的替代方案是使用來自operator包(documentation)的itemgetter

from operator import itemgetter 
people = [('bob', 28), ('alice', 21), ('jeff', 78)] 
print(sorted(people, key=itemgetter(1), reverse=True)) 

,這將給你完全相同的結果

[('jeff', 78), ('bob', 28), ('alice', 21)] 

itemgetter作爲替換爲lambda表達。