2017-08-25 76 views
1

我是蟒蛇新手,但我想通過類型的字典下面的列表迭代:如何通過其中一個值對字典列表進行排序,但打印另一個鍵的值?

MonthEngList = [{'MonthNumber': 1, 'MonthName': 'January'}, 
{'MonthNumber': 2, 'MonthName': 'February'}, {'MonthNumber': 3, 'MonthName': 'March'}, 
{'MonthNumber': 4, 'MonthName': 'April'}, {'MonthNumber': 5, 'MonthName': 'May'}, 
{'MonthNumber': 6, 'MonthName': 'June'}, {'MonthNumber': 7, 'MonthName': 'July'}, 
{'MonthNumber': 8, 'MonthName': 'August'}, {'MonthNumber': 9, 'MonthName': 'September'}, 
{'MonthNumber': 10, 'MonthName': 'October'}, {'MonthNumber': 11, 'MonthName': 'November'}, 
{'MonthNumber': 12, 'MonthName': 'December'}] 

我使用的標籤與matplotlib股票的陰謀,但不知何故月干預。 我弄清楚了,我應該使用sorted()..但我似乎無法把頭圍住它。

這裏是我做過什麼:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
fig = plt.figure() 
ax = fig.gca() 
pos_list_mm = np.arange(1,12) 

ax.yaxis.set_major_locator(ticker.FixedLocator((pos_list_mm))) 

ax.yaxis.set_major_formatter( ticker.FixedFormatter( 
sorted(MonthEngList,key=MonthEngList('MonthName'))) ) 

plt.show() 
plt.draw() 

產生:

Traceback (most recent call last): 
    File "vectorialbox_with_save.py", line 135, in <module> 
    ax.yaxis.set_major_formatter( ticker.FixedFormatter(sorted(MonthEngList,key=MonthEngList('MonthName'))) ) 
TypeError: 'list' object is not callable 

任何暗示至於如何做到這正常嗎?

回答

1

當您調用sorted()時,函數期望MonthEngList是一個字典。 MonthEngList實際上是一個字典列表。嘗試單獨運行MonthEngList('MonthName'),你會得到相同的列表不是可調用對象錯誤。

嘗試把你的月在字典中,看起來像這樣:

MonthEngList = {'MonthName':[Jan,...,Dec],'MonthNum':[1,...12]} 
0

下面是解儘可能分類詞典列表而言:

lst=map(lambda x:x.items(),MonthEngList) 

這個代碼轉換列表字典轉換爲元組列表(字典中的鍵值對),所以這將導致:

lst=[[('MonthNumber', 1), ('MonthName', 'January')], [('MonthNumber', 2), ('MonthName', 'February')], [('MonthNumber', 3), ('MonthName', 'March')], [('MonthNumber', 4), ('MonthName', 'April')], [('MonthNumber', 5), ('MonthName', 'May')], [('MonthNumber', 6), ('MonthName', 'June')], [('MonthNumber', 7), ('MonthName', 'July')], [('MonthNumber', 8), ('MonthName', 'August')], [('MonthNumber', 9), ('MonthName', 'September')], [('MonthNumber', 10), ('MonthName', 'October')], [('MonthNumber', 11), ('MonthName', 'November')], [('MonthNumber', 12), ('MonthName', 'December')]] 

下一頁排序列表基於每個列表,這是做的第二元組的第二個元素的列表:

y=sorted(lst,key=lambda x:x[1][1]) 

在排序結果最後提取從每個列表的第一元組的第二個元素,這是通過以下代碼實現的:

desired_list= map(lambda x:x[0][1],y) 
0

您應該能夠在幾個月內通過,因爲它們已經處於排序順序(即

ax.yaxis.set_major_formatter(ticker.FixedFormatter(
    [x['MonthName'] for x in MonthEngList])) 

在這裏我們使用列表理解從每個列表條目只提取MonthName。如果由於某種原因,你確實需要幾個月排序,你可以使用

ax.yaxis.set_major_formatter(ticker.FixedFormatter(
    [x['MonthName'] for x in sorted(MonthEngList, key=lambda y: y['MonthNumber'])])) 

這裏我們再次用一個列表理解只是爲了讓月份名稱,但我們首先排序基於每個列表項的MonthNumber名單。

相關問題