我的字符串看起来像" co1 / co2"," co3 / co4" ......" co11 / co12"
将其描述为正则表达式:
^(?P<prefix>\w\w)(?P<month>\d+)/(?P<prefix2>\w\w)(?P<month2>\d+)$
我想根据&#34; month&#34;的等价物对这些字符串的集合进行排序。正则表达组。 (字符串中的第一个数字(例如&#34; 1&#34;&#39; co1 / co2&#39;或&#34; 12&#34;&#39; co12 / co13&#39; ;)
我无法弄清楚我可以在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:]))
答案 0 :(得分:5)
没有正则表达式:
lambda x: int(x.partition('/')[0][2:])
这将获取/
之前的字符串部分,然后是除了起始co
之外的所有内容,然后将其转换为整数。
我使用str.partition()
因为拆分只有str.split()
的情况比{{3}}快。
演示:
>>> 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']
答案 1 :(得分:3)
试试这个:
>>> sorted(wrong_order, key = lambda x:int(x.split("/")[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']
Lambda它做了什么,首先用&#34; /&#34;并选择第一个值并选择1个索引后的值并转换为整数