我有一个包含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__'
答案 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
应该首先,否则使用None
将lambda x : (x[0],-(x[1] is not None),x[1] or ""
放在任何字符串之后。)