2

很抱歉不能出一个好的标题。

我有一个清单:

some_list = [[X, '4x01'], [X, '3x02'], [X, '4x02'], [X, '3x01']]

X我不在乎的东西在哪里。

我想使用以下优先级对列表中的第二个元素进行排序:

  1. 降序排列的第一个字符。
  2. 最后 2 个字符按升序排列。

最终输出应该是:

some_list = [[X, '4x01'], [X, '4x02'], [X, '3x01'], [X, '3x02']]

注意:给出错误答案的解决方案是:

output = sorted(some_list, key=lambda lis: lis[3], reverse=True)
4

2 回答 2

6
output = sorted(some_list, key=lambda x: (-ord(x[1][0]), x[1][-2:]))

示例运行(定义 XNone以便我可以复制粘贴您的列表定义):

>>> X = None
>>> some_list = [[X, '4x01'], [X, '3x02'], [X, '4x02'], [X, '3x01']]
>>> output = sorted(some_list, key=lambda x: (-ord(x[1][0]), x[1][-2:]))
>>> output
[[None, '4x01'], [None, '4x02'], [None, '3x01'], [None, '3x02']]
于 2013-01-04T07:48:56.047 回答
1

在这种情况下,您可以像 @Amber 那样使用复合键。但是,这种方法并不总是有效:例如,如果两个组件都是两个字符长(因为这个-ord(x[1][0])技巧不再有效),它就会失败。

这是一个更通用的解决方案:

In [15]: X = None

In [16]: some_list = [[X, '4x01'], [X, '3x02'], [X, '4x02'], [X, '3x01']]

In [17]: l = sorted(some_list, key=lambda (x,y):y[-2:])

In [18]: l = sorted(l, key=lambda (x,y):y[:1], reverse=True)

In [19]: l
Out[19]: [[None, '4x01'], [None, '4x02'], [None, '3x01'], [None, '3x02']]

它一次对列表进行一个标准排序,并利用 Python 的排序是stable的事实。

一种更通用的方法是提供一个比较器:

def f((x1,y1), (x2,y2)):
    c = cmp(y1[:1], y2[:1])
    if c != 0: return -c
    return cmp(y1[-2:], y2[-2:])

这可以按如下方式使用:

In [39]: sorted(some_list, cmp=f)
Out[39]: [[None, '4x01'], [None, '4x02'], [None, '3x01'], [None, '3x02']]
于 2013-01-04T08:00:57.423 回答