还在学习python(最后!)并且还不能完全绕过这个。我想要做的是使用列表中的第三项按值对列表进行排序。当值只是一个数字或字符串时,通过值对字典进行排序很容易,但这个列表让我感到困惑。
示例:
myDict = { 'item1' : [ 7, 1, 9], 'item2' : [8, 2, 3], 'item3' : [ 9, 3, 11 ] }
我希望能够按照每个列表中第三个值的顺序遍历字典,在本例中为9,3,11。
非常感谢您的帮助!
答案 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)
你说了两个完全不同的愿望:
根据定义,第一个是不可能的 - 对事物进行排序意味着按某种顺序重新排列。 Python字典本质上是无序的。第二种模糊可能,但极不可能实施。
你能做的是
“列表中的第三项”对我来说闻起来像“元组中的第三项”,“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))