並べ替えを使用して並べ替えてみました
dir =["A1","A2","A10","A3"]
sorted(dir)
私の期待する配列は
["A1","A2","A3","A10"]
しかし実際の結果は
["A1", "A10", "A2", "A3"]
Pythonで名前で配列を並べ替える方法は?
並べ替えを使用して並べ替えてみました
dir =["A1","A2","A10","A3"]
sorted(dir)
私の期待する配列は
["A1","A2","A3","A10"]
しかし実際の結果は
["A1", "A10", "A2", "A3"]
Pythonで名前で配列を並べ替える方法は?
アルファベット順に並べ替えているので、数字を分割してintに変換し、それで並べ替える必要があります。(文字列内の数字は単なる文字として扱われるため、「A10」を「認識」し、最初に「A」、次に「1」、次に「0」で並べ替えようとします。)例:
>>> sorted(dir, key=lambda x: int(x[1:]))
['A1', 'A2', 'A3', 'A10']
に「A」以外の文字dir
を含める場合は、より複雑な並べ替え方法が必要になりますが、同じ行に沿ったものになります。(さらに何dir
が含まれているのかを説明すると、その例を書くことができます。)mgilsonのコメントが指摘しているように、の要素がdir
1文字+数値形式に従う場合は、タプルの並べ替えを利用して次のようにすることができます。
>>> dir.append('B12')
>>> sorted(dir, key=lambda x: (x[0],int(x[1:])))
['A1', 'A2', 'A3', 'A10', 'B12']
この質問を拡張するには、インターフェイス名を自然な方法で並べ替える必要がありました。それをもう少し複雑にしているのは、インターフェースが多くのフレーバーで使用できることです...、などの従来の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)