sorted()与lambda函数

use*_*757 4 python sorting lambda

我的字符串看起来像"co1/co2","co3/co4"......"co11/co12"

将其描述为正则表达式:

^(?P<prefix>\w\w)(?P<month>\d+)/(?P<prefix2>\w\w)(?P<month2>\d+)$   
Run Code Online (Sandbox Code Playgroud)

我想根据正则表达式的"月"组的等价物对这些字符串的集合进行排序.(字符串中的第一个数字(例如,'co1/co2'中的"1"或'co12/co13中的"12")

我无法弄清楚我可以在sorted()中使用的lambda函数,它会为我做这个.

wrong_order = [u'co1/co2', u'co10/co11', u'co11/co12', u'co12/co13', u'co2/co3',
       u'co3/co4', u'co4/co5', u'co5/co6', u'co6/co7', u'co7/co8', u'co8/co9',
       u'co9/co10']


correct_order = [u'co1/co2', u'co2/co3', u'co3/co4', u'co4/co5', u'co5/co6', \
u'co6/co7', u'co7/co8', u'co8/co9', u'co9/co10', u'co10/co11', u'co11/co12', u'co12/co13']


#this lambda function doesn't work
output = sorted(wrong_order, key=lambda x: (x[2:]))
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

没有正则表达式:

lambda x: int(x.partition('/')[0][2:])
Run Code Online (Sandbox Code Playgroud)

这将获取字符串之前的部分/,然后除了起始之外的所有内容co,然后将其转换为整数.

我用的str.partition(),因为它是速度比str.split()分裂一次情况.

演示:

>>> wrong_order = [u'co1/co2', u'co10/co11', u'co11/co12', u'co12/co13', u'co2/co3',
...        u'co3/co4', u'co4/co5', u'co5/co6', u'co6/co7', u'co7/co8', u'co8/co9',
...        u'co9/co10']
>>> sorted(wrong_order, key=lambda x: int(x.partition('/')[0][2:]))
[u'co1/co2', u'co2/co3', u'co3/co4', u'co4/co5', u'co5/co6', u'co6/co7', u'co7/co8', u'co8/co9', u'co9/co10', u'co10/co11', u'co11/co12', u'co12/co13']
Run Code Online (Sandbox Code Playgroud)