使用数字键在Python中订购字典列表

时间:2017-11-28 19:50:19

标签: python sorting dictionary

我有一个包含python中字典的数组列表。这里有我的例子:

[[(0, 1), 'up'], [(1, 2), 'right'], [(3, 2), None], [(0, 0), 'up'], [(3, 0), 'left'], [(3, 1), None], [(2, 1), 'up'], [(2, 0), 'left'], [(2, 2), 'right'], [(1, 0), 'left'], [(0, 2), 'right']]

我需要做的是先根据x上的键(x,y)和y之后的顺序进行排序:是否可能?

这里有我想要的输出:

[[(0, 0), 'up'], [(0, 1), 'up'], [(0, 2), 'right'], [(1, 0), 'left'],[(1, 2), 'right'], [(2, 0), 'left'], ....]

我尝试过使用该代码:

s = sorted(s, key = lambda x: (x[0][0][0], x[0][0][1]))

但它返回:

TypeError: 'int' object has no attribute '__getitem__'

1 个答案:

答案 0 :(得分:3)

你在订阅方面做得太深了。在你的情况下,只需对元组进行排序,元组的词典顺序适合你的问题:

sorted(s,key = lambda x : x[0])

或没有lambda的{​​{1}}:

operator.itemgetter

结果:

sorted(s,key = operator.itemgetter(0))

这个数据集的有趣之处在于,由于你的最后一个参数,你可以不使用密钥[[(0, 0), 'up'], [(0, 1), 'up'], [(0, 2), 'right'], [(1, 0), 'left'], [(1, 2), 'right'], [(2, 0), 'left'], [(2, 1), 'up'], [(2, 2), 'right'], [(3, 0), 'left'], [(3, 1), None], [(3, 2), None]] ,这可以是一个字符串或sorted(s)

在这些特定的值上,它似乎有效,但在平局的情况下(2个相同的元组,其他术语是字符串和None),None会比较字符串和sort,这在Python 3中不起作用。

但是可以通过使用像None这样的关键函数来解决,所以如果lambda x : (x[0],x[1] or "")x[1],它会将其更改为空字符串并且比较有效(如果None应该首先,否则使用Nonelambda x : (x[0],-(x[1] is not None),x[1] or ""放在任何字符串之后。)