Python:排序列表字典

时间:2009-08-01 19:07:17

标签: python list sorting dictionary

还在学习python(最后!)并且还不能完全绕过这个。我想要做的是使用列表中的第三项按值对列表进行排序。当值只是一个数字或字符串时,通过值对字典进行排序很容易,但这个列表让我感到困惑。

示例:

myDict = { 'item1' : [ 7, 1, 9], 'item2' : [8, 2, 3], 'item3' : [ 9, 3, 11 ] }

我希望能够按照每个列表中第三个值的顺序遍历字典,在本例中为9,3,11。

非常感谢您的帮助!

5 个答案:

答案 0 :(得分:39)

以下是一种方法:

>>> sorted(myDict.items(), key=lambda e: e[1][2])
[('item2', [8, 2, 3]), ('item1', [7, 1, 9]), ('item3', [9, 3, 11])]

sorted函数的key argument可让您为列表的每个元素派生一个排序键。

要迭代此列表中的键/值,您可以使用以下内容:

>>> for key, value in sorted(myDict.items(), key=lambda e: e[1][2]):
...   print key, value
... 
item2 [8, 2, 3]
item1 [7, 1, 9]
item3 [9, 3, 11]

答案 1 :(得分:3)

你说了两个完全不同的愿望:

  1. “我想要做的是对列表进行排序......”
  2. “我希望能够按照......的顺序遍历字典”。
  3. 根据定义,第一个是不可能的 - 对事物进行排序意味着按某种顺序重新排列。 Python字典本质上是无序的。第二种模糊可能,但极不可能实施。

    你能做的是

    1. 获取字典内容的副本(这将是相当的 无序的)
    2. 排序
    3. 迭代排序结果 - 你已经有两个了 解决方案。顺便说一句,使用“密钥”的解决方案 “cmp”更好;见sorted
    4. “列表中的第三项”对我来说闻起来像“元组中的第三项”,“e [1] [2]”只是闻起来:-) ...你可能想调查使用命名元组而不是列表;见named tuple factory

      如果您要经常在大型数据集上进行提取/排序/处理,您可能会考虑使用Python提供的sqlite3模块:

      create table ex_dict (k text primary key, v0 int, v1 int, v2 int);
      insert into ex_dict values('item1', 7, 1, 9);
      -- etc etc 
      select * from ex_dict order by v2;
      

答案 2 :(得分:3)

正如John Machlin所说,你实际上无法对Python字典进行排序。

但是,您可以创建键的索引,可以按照您喜欢的任何顺序进行排序。

用于按任何替代标准排序的首选Python模式(习语)称为“decorate-sort-undecorate”(DSU)。在这个成语中,您创建一个临时列表,其中包含您的密钥的元组,后跟原始数据元素,然后在该列表上调用正常的 .sort()方法(或者,在更新的版本中) Python只是将你的装饰包装在一个被调用的 sorted()内置函数中。然后你删除“装饰品”。

这通常优于将比较函数传递给 .sort()方法的原因是Python的内置默认排序代码(在普通的C Python中编译的C)非常快速有效在默认情况下,但是在非默认情况下必须多次调用Python对象代码时要慢得多。因此,迭代数据创建可以传递给默认排序例程的数据结构通常要好得多。

在这种情况下,你应该可以使用类似的东西:

[y[1] for y in sorted([(myDict[x][2], x) for x in myDict.keys()])]

...这是一个列表理解,从内部列表理解返回的元组排序列表中进行undecorate。内部理解是创建一组元组,您想要的排序键(列表的第3个元素)和与排序键对应的字典键。 myDict.keys()当然是Python字典的一种方法,它以底层实现选择的任何顺序返回所有有效键的列表 - 大概是对哈希的简单迭代。

更简洁的方法可能更容易理解:

temp = list()
for k, v in myDict.items():
    temp.append((v[2],))
temp.sort()
results = list()
for i in temp:
    results.append(i[1])

通常,您应该使用小数据样本在解释器中迭代地构建此类代码。构建“装饰”表达式或功能。然后将其包含在对 sorted()的调用中。然后构建undecorate表达式(通常与我在此处显示的一样简单)。

答案 3 :(得分:1)

参加晚会,我不知道这是不是你的想法,但它可能对某人有用。如果输出应该是一个列表:

list_third =[]

for x in my_dic.keys():
    list_third.append(my_dic[x][2])

答案 4 :(得分:0)

现在你可以这样做了;返回字典本身。最后的Boolean是判断顺序是升序还是降序。

sorted_dict = dict(sorted(myDict.items(), key=lambda item: item[1][2], reverse=True))