在Python中使用数字键对字典列表进行排序
我有一个数组列表,其中包含一个python字典。下面是我的例子:在Python中使用数字键对字典列表进行排序,python,sorting,dictionary,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,y)先在x上订购,然后在
[[(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,y)先在x上订购,然后在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__'
你订阅得太深了。在您的情况下,仅对元组进行排序,元组的字典顺序适合您的问题:
sorted(s,key = lambda x : x[0])
或不带lambda
和运算符。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]]
这个数据集的有趣之处在于,由于上一个参数可以是字符串或None
,因此不能在没有键的情况下使用sorted(s)
在这些特定的值上,它似乎是有效的,但在tie(两个相同的元组,其他术语是字符串和None
)的情况下,sort
将比较字符串和None
,这在Python 3中不起作用
但是可以通过使用像
lambda x:(x[0]、x[1]或“”)这样的键函数来解决问题。因此,如果x[1]
为None
则将其更改为一个空字符串,并且比较有效(如果None
应该是第一个,否则使用lambda x:(x[0]、-(x[1]不是None)、x[1]或“
将置于任何字符串之后).x
是列表元素,那么您只需要对元组进行排序,所以您需要x[0]
没有更深的层次:)如果元组包含类似('0','0')的字符串,这会起作用吗,或者应该指定key=lambda x:(x[0][0],x[0][1])
?您所陈述的内容与重建元组的x:x[0]
相同。