4

前のstackoverflowの質問では、文字列のリストをアルファベット順に並べ替える方法について説明しています。タプルのリストをタプルの最初の要素で英数字でソートしたいと思います。

例1:

>>> sort_naturally_tuple([('b', 0), ('0', 1), ('a', 2)])
[('0', 1), ('a', 2), ('b', 0)]

例2:

>>> sort_naturally_tuple([('b10', 0), ('0', 1), ('b9', 2)])
[('0', 1), ('b9', 2), ('b10', 0)]

更新: 英数字を強調するには、例2を確認してください。

4

4 に答える 4

5

他の質問からの2番目の回答を使用して、キーを取得するための基礎としてアイテムの任意のメソッドをサポートするように一般化されました。

import re
from operator import itemgetter

def sorted_nicely(l, key):
    """ Sort the given iterable in the way that humans expect."""
    convert = lambda text: int(text) if text.isdigit() else text
    alphanum_key = lambda item: [ convert(c) for c in re.split('([0-9]+)', key(item)) ]
    return sorted(l, key = alphanum_key)


print sorted_nicely([('b10', 0), ('0', 1), ('b9', 2)], itemgetter(0))

これは、アイテムの操作として呼び出し可能オブジェクトを使用するように一般化されていることを除いて、その回答とまったく同じです。文字列に対してのみ実行する場合は、を使用しますlambda item: item。リスト、タプル、dict、またはセットに対して実行する場合は、を使用operator.itemgetter(key_or_index_you_want)します。クラスインスタンスに対して実行する場合は、を使用します。を使用できますoperator.attrgetter('attribute_name_you_want')

それは与えます

[('0', 1), ('b9', 2), ('b10', 0)]

あなたの例#2のために。

于 2011-07-27T18:24:47.633 に答える
4

タプルは、デフォルトでは、最初から要素でソートされます。だから単純に

L = [('b', 0), ('0', 1), ('a', 2)]
L.sort()
print L
# or create a new, sorted list
print sorted([('b', 0), ('0', 1), ('a', 2)])

あなたが好きな質問は、通常の(英数字)並べ替えとは異なる自然並べ替えについて話します。

最初のアイテムのみで自然ソートを実行したいとします。

import re
def naturalize(item):
    # turn 'b10' into ('b',10) which sorts correctly
    m = re.match(r'(\w+?)(\d+)', item)
    return m.groups()
# now sort by using this function on the first element of the tuple:
print sorted(L, key=lambda tup: naturalize(tup[0]))
于 2011-07-27T18:06:14.020 に答える
1

他の人が指摘しているように、sortedはデフォルトでタプルの最初の要素を使用します。このデフォルトの動作を変更する場合は、比較中に使用するキーを指定できます。

sorted([('b', 0), ('0', 1), ('a', 2)])

次と同じように返されます:

sorted([('b', 0), ('0', 1), ('a', 2)], key=lambda item: item[0])

ただし、2番目の要素で並べ替えるには、次のことを試してください。

sorted([('b', 0), ('0', 1), ('a', 2)], key=lambda item: item[1])
于 2011-07-27T18:09:52.360 に答える
0

natsortモジュールは、追加の作業なしでデフォルトでこれを実行します

>>> from natsort import natsorted
>>> natsorted([('b', 0), ('0', 1), ('a', 2)])
[('0', 1), ('a', 2), ('b', 0)]
>>> natsorted([('b10', 0), ('0', 1), ('b9', 2)])
[('0', 1), ('b9', 2), ('b10', 0)]
于 2015-01-15T04:08:35.627 に答える