我正在尝试按小写-->大写-->nums 的顺序对字符串“sOrTiNg1234”进行排序
我做到了
string = sorted(input(), key = lambda c: (c.isdigit(), c.isupper(),c.islower()))
我必须按看起来正确的键进行操作。例如,我首先想检查它是否是一个字母,然后我想检查它是否是小写,然后检查它是否是大写。然而,效果似乎恰恰相反。
有人可以解释一下键到底是如何与排序一起工作的吗?
非常感谢
最佳答案
正如评论中简要暗示的那样,问题在于 True == 1
和 False == 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']
或者通过否定各个键(也
不起作用):
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']
关于python - 使用 lambda 排序(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44535122/