これは、最近私が直面した楽しい小さな課題です。以下に私の答えを示しますが、よりエレガントで効率的なソリューションがあるかどうかを知りたいです。
私に提示された要件の説明:
- 文字列は英数字です (以下のテスト データセットを参照)
- 文字列は自然にソートする必要があります(説明については、この質問を参照してください)
- 英字は数字の前にソートする必要があります (つまり、'100' の前に 'abc' を配置します)。
- アルファベット文字の大文字のインスタンスは、小文字のインスタンスの前にソートする必要があります (つまり、'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'])