2

並べ替えを使用して並べ替えてみました

dir =["A1","A2","A10","A3"]
sorted(dir)

私の期待する配列は

["A1","A2","A3","A10"]

しかし実際の結果は

["A1", "A10", "A2", "A3"]

Pythonで名前で配列を並べ替える方法は?

4

2 に答える 2

6

アルファベット順に並べ替えているので、数字を分割してintに変換し、それで並べ替える必要があります。(文字列内の数字は単なる文字として扱われるため、「A10」を「認識」し、最初に「A」、次に「1」、次に「0」で並べ替えようとします。)例:

>>> sorted(dir, key=lambda x: int(x[1:]))
['A1', 'A2', 'A3', 'A10']

に「A」以外の文字dirを含める場合は、より複雑な並べ替え方法が必要になりますが、同じ行に沿ったものになります。(さらに何dirが含まれているのかを説明すると、その例を書くことができます。)mgilsonのコメントが指摘しているように、の要素がdir1文字+数値形式に従う場合は、タプルの並べ替えを利用して次のようにすることができます。

>>> dir.append('B12')
>>> sorted(dir, key=lambda x: (x[0],int(x[1:])))
['A1', 'A2', 'A3', 'A10', 'B12']
于 2012-09-30T04:03:50.243 に答える
0

この質問を拡張するには、インターフェイス名を自然な方法で並べ替える必要がありました。それをもう少し複雑にしているのは、インターフェースが多くのフレーバーで使用できることです...、などの従来のloスキームeth0と、のようないくつかのより高度なスキームがありenp4s0f1d1ます。解決策は、タイプに基づいてそれらを分割し、数値をintに変換し、同じタイプで比較が行われるように注意する必要があります。

だから私はかなり防弾でなければならないこのソート関数を思いついた(あなたがそれに文字列を与える限り...)

def ethkey(eth):
    """Split an ethernet device name between text and digit groups as int,
    allowing consistent sorting of interfaces.

    Usage: `sorted(if_list, key=ethkey)`

    :param eth: Value to sort
    :type eth: str
    :return: List of str's (even indexes) and int's (odd indexes) to compare
    :rtype: list
    """

    keys = []
    if not eth:
        # If eth is a string it's empty, just return blank list
        return keys

    # Start with the first character already in last
    last, eth = eth[0], eth[1:]
    # If last is int we start at offset 1
    if last.isdigit():
        keys.append('')

    for i in eth:
        if i.isdigit() is last.isdigit():
            # Keep accumulating same type chars
            last += i
        else:
            # Save and restart next round
            keys.append(int(last) if last.isdigit() else last)
            last = i

    # Save final round and return
    keys.append(int(last) if last.isdigit() else last)
    return keys

その後、次のように使用できます。

sorted(int_list, key=ethkey)
于 2019-10-04T17:16:06.287 に答える