如何按其中一个值对字典列表排序,但打印另一个键的值?

2024-09-28 22:26:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个python新手,但我正在尝试遍历下面的dict列表:

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中带有ticker的绘图的标签,但是不知怎么的,几个月都被搞得一团糟。 我想我应该用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

关于如何正确地做这件事有什么提示吗?你知道吗


Tags: importmatplotlibasnppltaxlistticker
3条回答

以下是有关词典列表排序的解决方案:

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)

你应该能够通过在几个月,因为他们已经在排序顺序(即

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对列表进行排序。你知道吗

调用sorted()时,函数希望MonthEngList是字典。MonthEngList实际上是一个字典列表。试着单独运行MonthEngList('MonthName'),你会发现同样的列表不是一个可调用的对象错误。你知道吗

试着把你的月份放在这样的字典里:

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

相关问题 更多 >