这是我最近遇到的一个有趣的小挑战。我将在下面提供我的答案,但我很想知道是否有更优雅或更有效的解决方案。
向我提出的要求的描述:
- 字符串是字母数字的(参见下面的测试数据集)
- 字符串应该自然排序(参见这个问题的解释)
- 字母字符应排在数字字符之前(即 'abc' 在 '100' 之前)
- alpha 字符的大写实例应排在小写实例之前(即'ABc'、'Abc'、'abc')
这是一个测试数据集:
test_cases = [
# (unsorted list, sorted list)
(list('bca'), ['a', 'b', 'c']),
(list('CbA'), ['A', 'b', 'C']),
(list('r0B9a'), ['a', 'B', 'r', '0', '9']),
(['a2', '1a', '10a', 'a1', 'a100'], ['a1', 'a2', 'a100', '1a', '10a']),
(['GAM', 'alp2', 'ALP11', '1', 'alp100', 'alp10', '100', 'alp1', '2'],
['alp1', 'alp2', 'alp10', 'ALP11', 'alp100', 'GAM', '1', '2', '100']),
(list('ra0b9A'), ['A', 'a', 'b', 'r', '0', '9']),
(['Abc', 'abc', 'ABc'], ['ABc', 'Abc', 'abc']),
]
奖励测试用例
这受到Janne Karila 在下面的评论的启发,即所选答案当前失败(但在我的情况下并不是一个实际问题):
(['0A', '00a', 'a', 'A', 'A0', '00A', '0', 'a0', '00', '0a'],
['A', 'a', 'A0', 'a0', '0', '00', '0A', '00A', '0a', '00a'])