我有一個像下面這樣的字典。鍵值對或用戶名:名字Python排序多個屬性
d = {"user2":"Tom Cruise", "user1": "Tom Cruise"}
我的問題是,我需要通過名稱進行排序這些,但如果多個用戶包含相同的名稱,如上面,然後我需要梳理那些由他們的用戶名。我查了一下已排序的函數,但我並不真正瞭解cmp參數和lambda。如果有人能解釋這些,並幫助我,這將是偉大的!謝謝:)
我有一個像下面這樣的字典。鍵值對或用戶名:名字Python排序多個屬性
d = {"user2":"Tom Cruise", "user1": "Tom Cruise"}
我的問題是,我需要通過名稱進行排序這些,但如果多個用戶包含相同的名稱,如上面,然後我需要梳理那些由他們的用戶名。我查了一下已排序的函數,但我並不真正瞭解cmp參數和lambda。如果有人能解釋這些,並幫助我,這將是偉大的!謝謝:)
cmp
已過時。 lambda
只是一個功能。
sorted(d.iteritems(), key=operator.itemgetter(1, 0))
我只是要詳細說明伊格納西奧巴斯克斯 - 艾布拉姆斯的答案。 cmp
已棄用。不要使用它。改爲使用key
屬性。
lambda
發揮作用。這是一個表達式,所以可以去正常def
聲明不能的地方,但它的正文僅限於單個表達式。
my_func = lambda x: x + 1
這定義一個函數,它只有一個參數,x
並返回x + 1
。 lambda x, y=1: x + y
定義了一個函數,該函數採用參數x
,可選y
參數的默認值爲1並返回x + y
。正如你所看到的,它實際上就像一個def
聲明,只不過它是一個表達式,並且僅限於主體的單個表達式。
key
的屬性的目的是sorted
將它稱爲對序列的每個元素進行排序,並使用它返回用於比較的值。
list_ = ['a', 'b', 'c']
sorted(list_, key=lambda x: 1)
只讀一個假設的例子。在撰寫本文之前,我沒有仔細研究問題。儘管如此,我仍會保留它的教育。
我們真的不能多說,因爲
dict
秒。你有一個dicts
s的清單嗎?我們可以排序。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'))
這正是伊格納西奧巴斯克斯 - 艾布拉姆斯建議。
你應該知道字典不能被排序。但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')])
的事情是,這是對我的階級和IM不得進口庫,例如運營商的任務的一部分。它唯一的內建函數。我明白你在做什麼,我試圖即興創作。我用「排序(l,key = lambda l:(l [0],l [1]))」,你認爲這相當於你說的嗎? – 1337holiday 2010-11-29 01:13:00
不完全。 `lambda x:(x [1],x [0])` – 2010-11-29 01:21:30
所以這個函數是排序的名字,但如果名稱相同,那麼它對用戶名進行排序,還是保持它們的位置相同?因爲我需要它,所以如果名稱相同,則按用戶名排序。非常感謝! – 1337holiday 2010-11-29 01:31:24