2010-11-28 61 views
3

我有一個像下面這樣的字典。鍵值對或用戶名:名字Python排序多個屬性

d = {"user2":"Tom Cruise", "user1": "Tom Cruise"} 

我的問題是,我需要通過名稱進行排序這些,但如果多個用戶包含相同的名稱,如上面,然後我需要梳理那些由他們的用戶名。我查了一下已排序的函數,但我並不真正瞭解cmp參數和lambda。如果有人能解釋這些,並幫助我,這將是偉大的!謝謝:)

回答

6

cmp已過時。 lambda只是一個功能。

sorted(d.iteritems(), key=operator.itemgetter(1, 0)) 
+0

的事情是,這是對我的階級和IM不得進口庫,例如運營商的任務的一部分。它唯一的內建函數。我明白你在做什麼,我試圖即興創作。我用「排序(l,key = lambda l:(l [0],l [1]))」,你認爲這相當於你說的嗎? – 1337holiday 2010-11-29 01:13:00

+0

不完全。 `lambda x:(x [1],x [0])` – 2010-11-29 01:21:30

+0

所以這個函數是排序的名字,但如果名稱相同,那麼它對用戶名進行排序,還是保持它們的位置相同?因爲我需要它,所以如果名稱相同,則按用戶名排序。非常感謝! – 1337holiday 2010-11-29 01:31:24

5

我只是要詳細說明伊格納西奧巴斯克斯 - 艾布拉姆斯的答案。 cmp已棄用。不要使用它。改爲使用key屬性。

lambda發揮作用。這是一個表達式,所以可以去正常def聲明不能的地方,但它的正文僅限於單個表達式。

my_func = lambda x: x + 1 

這定義一個函數,它只有一個參數,x並返回x + 1lambda x, y=1: x + y定義了一個函數,該函數採用參數x,可選y參數的默認值爲1並返回x + y。正如你所看到的,它實際上就像一個def聲明,只不過它是一個表達式,並且僅限於主體的單個表達式。

key的屬性的目的是sorted將它稱爲對序列的每個元素進行排序,並使用它返回用於比較的值。

list_ = ['a', 'b', 'c'] 
sorted(list_, key=lambda x: 1) 

只讀一個假設的例子。在撰寫本文之前,我沒有仔細研究問題。儘管如此,我仍會保留它的教育。 我們真的不能多說,因爲

  1. 無法排序dict秒。你有一個dicts s的清單嗎?我們可以排序。
  2. 您尚未顯示username密鑰。

我假設它的東西就像

users = [{'name': 'Tom Cruise', 'username': user234234234, 'reputation': 1}, 
     {'name': 'Aaron Sterling', 'username': 'aaronasterling', 'reputation': 11725}] 

如果你想確認我比湯姆·克魯斯更真棒,你可以這樣做:

sorted(users, key=lambda x: x['reputation']) 

這只是傳遞一個函數,返回列表中每個字典的'reputation'值。但lambdas可能會變慢。大多數時間operator.itemgetter是你想要的。

operator.itemgetter需要一系列鍵並返回一個函數,該函數接受一個對象並返回其參數值的元組。

所以f = operator.itemgetter('name', 'username')將本質上相同的函數返回的 lambda d: (d['name'], d['username'])所不同的是,它應該在原則上運行得更快,你不必看醜陋lambda表達式。

所以按名稱排序的dict秒的列表,然後用戶名,​​只是做

sorted(list_of_dicts, operator.itemgetter('name', 'username')) 

這正是伊格納西奧巴斯克斯 - 艾布拉姆斯建議。

0

你應該知道字典不能被排序。但python 2.7 & 3.1有這個類collections.OrderedDict。

所以,

>>> from collections import OrderedDict 
>>> d=OrderedDict({'D':'X','B':'Z','C':'X','A':'Y'}) 
>>> d 
OrderedDict([('A', 'Y'), ('C', 'X'), ('B', 'Z'), ('D', 'X')]) 
>>> OrderedDict(sorted((d.items()), key=lambda t:(t[1],t[0]))) 
OrderedDict([('C', 'X'), ('D', 'X'), ('A', 'Y'), ('B', 'Z')])