python - 使用 lambda 排序(python)

标签 python lambda

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

我做到了

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

我必须按看起来正确的键进行操作。例如,我首先想检查它是否是一个字母,然后我想检查它是否是小写,然后检查它是否是大写。然而,效果似乎恰恰相反。

有人可以解释一下键到底是如何与排序一起工作的吗?

非常感谢

最佳答案

正如评论中简要暗示的那样,问题在于 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']

或者通过否定各个键(不起作用):

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/

相关文章:

c++ - 给定一个包含 lambda 函数的调用堆栈,如何确定其来源?

c# - 在 C# 中将方法作为参数从不同的类传递

python - 对多语言国家/地区名称进行排序

c# - Lambda 解释和它是什么以及一个很好的例子

python - 使用 Popen 在 Python 中实现持久 ssh session

python - numpy 2d 区域的快速随机到唯一重新标记(无循环)

python - 递归地找到正确的读取顺序

python - 在 Bokeh 刻度标签中插入换行符

python - 在 Mac OS 上使用 virtualenvwrapper 在 python 版本之间切换

C++14 使用捕获说明符在 lambda 函数内部递增一个值