用lambda(python)排序

时间:2017-06-14 03:54:09

标签: python lambda

我正在尝试按小写的顺序对字符串'sOrTiNg1234'进行排序 - >大写 - > nums

我做了

string = sorted(input(), key = lambda c: (c.isdigit(), c.isupper(),c.islower()))

我不得不做关键的事情。例如,我首先要检查它是否是一个字母,然后我想检查它是否是小写,然后检查它是否是大写的。然而,恰恰相反似乎有效。

有人可以解释一下这些键究竟是如何与排序的一起工作的吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

正如评论中简要暗示的那样,问题是True == 1False == 0,因此True实际上是在 False之后排序的。因此,如果您按“直观”顺序放置键,则可以得到:

>>> s = 'sOrTiNg1234'
>>> sorted(s, key = lambda c: (c.islower(), c.isupper(), c.isdigit()))
['1', '2', '3', '4', 'O', 'T', 'N', 's', 'r', 'i', 'g']

通过查看关键元组可能会更清楚一些:

>>> [(c, map(int, (c.islower(), c.isupper(), c.isdigit()))) for c in s]
[('s', [1, 0, 0]),
 ('O', [0, 1, 0]),
 ('r', [1, 0, 0]),
 ('T', [0, 1, 0]),
 ('i', [1, 0, 0]),
 ('N', [0, 1, 0]),
 ('g', [1, 0, 0]),
 ('1', [0, 0, 1]),
 ('2', [0, 0, 1]),
 ('3', [0, 0, 1]),
 ('4', [0, 0, 1])]

您可以使用reverse参数:

来解决此问题
>>> sorted(s, key = lambda c: (c.islower(), c.isupper(), c.isdigit()), reverse=True)
['s', 'r', 'i', 'g', 'O', 'T', 'N', '1', '2', '3', '4']

或者,正如您所做的那样,通过反转键元组中的值:

>>> sorted(s, key = lambda c: (c.isdigit(), c.isupper(), c.islower()))
['s', 'r', 'i', 'g', 'O', 'T', 'N', '1', '2', '3', '4']

或者否定个别密钥(not也有效):

sorted(s, key = lambda c: (-c.islower(), -c.isupper(), -c.isdigit()))
['s', 'r', 'i', 'g', 'O', 'T', 'N', '1', '2', '3', '4']

另请注意,使用lower upper实际上是多余的:

>>> sorted(s, key = lambda c: (c.isdigit(), c.isupper()))
['s', 'r', 'i', 'g', 'O', 'T', 'N', '1', '2', '3', '4']

如果您还想按字符本身排序,请在元组末尾添加它:

>>> sorted(s, key = lambda c: (c.isdigit(), c.isupper(), c))
['g', 'i', 'r', 's', 'N', 'O', 'T', '1', '2', '3', '4']

答案 1 :(得分:0)

我所做的是将所有字母数字字符映射到某些数字

较小的字母字母通过从较小的字母字母的ascii值中减去97而从0映射到25。

类似地,较大的大小写字母通过减去65(ord('A'))并从较小的字母字母的ascii值中添加26来从26映射到51。

类似的数值通过从数字字符的ascii值中减去48(ord('0')而从52映射到61​​

在完成所有这些后,每个角色指向一些数字。并且所有字符都根据这些数字排序。最后在对列表进行排序后,我加入了所有字符

def function(alpha) : 

    if alpha.islower():
        return ord(alpha)-97  #from a(0) to z(25) 
    elif alpha.isupper():
        return ord(alpha)-65+(26)  #from A(26)  to Z(51)
    else:
        return ord(alpha)-48+(52)   #from 0(52)  to 9(61)
x="sOrTiNg1234"

y=list(x)      

y=sorted(y,key=function)

answer=''.join(y)

我希望它有道理:)