2017-03-28 106 views
2

我有一個字典構成元組鍵和整數計數,我想由元組的(鍵[2])作爲這樣Python的 - 由元組值順序進行排序的元組鍵控字典

data = {(a, b, c, d): 1, (b, c, b, a): 4, (a, f, l, s): 3, (c, d, j, a): 7} 
print sorted(data.iteritems(), key = lambda x: data.keys()[2]) 
第三值對它進行排序

與該預期輸出

>>> {(b, c, b, a): 4, (a, b, c, d): 1, (c, d, j, a): 7, (a, f, l, s): 3} 

,但我現在的代碼似乎什麼也不做。這應該怎麼做?

編輯:適當的代碼是

sorted(data.iteritems(), key = lambda x: x[0][2]) 

但在上下文

from collections import Ordered Dict 
data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7} 
xxx = [] 
yyy = [] 
zzz = OrderedDict() 
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]): 
    x = key[2] 
    y = key[3] 
    xxx.append(x) 
    yyy.append(y) 
    zzz[x + y] = 1 
print xxx 
print yyy 
print zzz 

zzz爲無序。我知道這是因爲字典默認是無序的,我需要使用OrderedDict對其進行排序,但我不知道在哪裏使用它。如果我使用它作爲選中的答案,表明我得到'元組索引超出範圍'的錯誤。

解決方案:

from collections import OrderedDict 
data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7} 
xxx = [] 
yyy = [] 
zzz = OrderedDict() 
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]): 
    x = key[2] 
    y = key[3] 
    xxx.append(x) 
    yyy.append(y) 
    zzz[x + y] = 1 
print xxx 
print yyy 
print zzz 
+2

字典未排序 – depperm

+0

字典可以在iteritems被調用時進行排序。 –

+0

@JonathanConnell:這並不意味着你可以得到你想要的結果。 –

回答

3

字典是Python中無序。但是,您可以使用OrderedDict

你就必須有點像:

from collections import OrderedDict 

result = OrderedDict(sorted(data.iteritems(),key=lambda x:x[0][2]))

您需要使用key=lambda x:x[0][2]因爲元素的元組(key,val),並且因此得到了key,您使用x[0]

這給:

>>> data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7} 
>>> from collections import OrderedDict 
>>> result = OrderedDict(sorted(data.iteritems(),key=lambda x:x[0][2])) 
>>> result 
OrderedDict([(('b', 'c', 'b', 'a'), 4), (('a', 'b', 'c', 'd'), 1), (('c', 'd', 'j', 'a'), 7), (('a', 'f', 'l', 's'), 3)]) 

編輯

爲了使zzz有序的,以及,你可以更新您的代碼:

data = {('a', 'b', 'c', 'd'): 1, ('b', 'c', 'b', 'a'): 4, ('a', 'f', 'l', 's'): 3, ('c', 'd', 'j', 'a'): 7} 
xxx = [] 
yyy = [] 
zzz = OrderedDict() 
for key, value in sorted(data.iteritems(), key = lambda x: x[0][2]): 
    x = key[2] 
    y = key[3] 
    xxx.append(x) 
    yyy.append(y) 
    zzz[x + y] = 1 
print xxx 
print yyy 
print zzz
+0

實際的問題是排序鍵,您修正了但沒有解釋。 –

+0

@MartijnPieters:這就是爲什麼他們發明了一些東西[編輯]。首先給出答案可以測試,然後解釋。所以如果答案不符合期望,浪費的時間就會減少:)。我注意到你實際上幾乎總是這樣做:) –

+0

該帖子的[修訂](https://stackoverflow.com/posts/43070905/revisions)顯示'key = lambda x:data.keys()[2 ]版本在前5分鐘就有了。 –

3

你的主要功能是完全破碎。它的當前值爲x,但您忽略該值,而是始終從鍵列表中獲取第二項。

改爲使用key=lambda x: x[0][2]

+0

我想你必須使用'x [0] [2]''iteritems()'發出(鍵,值)元組。 –

+0

謝謝,你是正確的 - 修復。 –