14

次のような詳細で構成されるリストがあります。

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]

ここで、値が次の順序になるように、このリストを並べ替えたいと思います。

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"]

明らかにそうするだけlist1.sort()では正しい答えが得られません-それは次のようになります:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"]

これは、Pythonがこれらすべてを文字列として直接扱うためだと思います。ただし、最初に数値に基づいて並べ替え、次に数字に続く文字に基づいて並べ替えたいと思います。

続行するにはどうすればよいですか?

どうもありがとう :)

4

2 に答える 2

25

自然な並べ替えを使用したい:

import re

_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
    return [int(text) if text.isdigit() else text.lower()
            for text in re.split(_nsre, s)]   

使用例:

>>> list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]
>>> list1.sort(key=natural_sort_key)
>>> list1
['1', '2C', '36', '100A', '132', '302F', '342B']

これは、要素をリストに分割して数値を分離し、それらを文字列ではなく整数として比較することによって機能します。

>>> natural_sort_key("100A")
['', 100, 'a']
>>> natural_sort_key("342B")
['', 342, 'b']

これは、int と int、および string と string を常に比較している場合にのみ Python3 で機能することに注意してください。それ以外の場合は、TypeError: unorderable types例外が発生します。

于 2013-10-14T18:25:12.280 に答える
0

まず、文字列を数値に変換する方法を見つける必要があります。例えば

import re
def convert(str):
    return int("".join(re.findall("\d*", str)))

そして、それをソートキーとして使用します:

list1.sort(key=convert)
于 2013-10-14T18:24:50.863 に答える