7

新しいPythonでは、sorted関数を使用して、最後の数文字に従って文字列のリストを簡単に並べ替えることができます。

lots_list = ['anything']

print sorted(lots_list, key=returnlastchar)

def returnlastchar(s):     
    return s[10:] 

lots_list.sort()上記を古いPython(2.3)に実装するにはどうすればよいですか?

「エラー:、を使用してみたところsorted()the global name sorted is not defined。」

4

4 に答える 4

8

シュワルツ変換は、通常、引数を使用するよりも効率的ですcmp(これは、key引数を使用するときに Python の新しいバージョンが行うことです)

lots_list=['anything']

def returnlastchar(s):     
    return s[10:] 

decorated = [(returnlastchar(s), s) for s in lots_list]
decorated.sort()
lots_list = [x[1] for x in decorated]
于 2012-07-03T03:27:20.157 に答える
6

ただし、この投稿によると、python 2.3 は手元にありません Python 2.3 の項目頻度によるリストのリストの並べ替え http://docs.python.org/release/2.3/lib/typesseq-mutable.html このメソッドあなたのためにも働くはずです。

def mycmp(a, b):
    return cmp(a[10:], b[10:])

lots_list.sort(mycmp)
于 2012-07-03T03:23:30.947 に答える
1

自分のバージョンのsortedを書くのは難しくありません。これはドロップイン置換です ( cmpパラメーターを除く):

def _count():
    i = 0
    while 1:
        yield i
        i += 1

def sorted(iterable, key=None, reverse=False):
    'Drop-in replacement for the sorted() built-in function (excluding cmp())'
    seq = list(iterable)
    if reverse:
        seq.reverse()
    if key is not None:
        seq = zip(map(key, seq), _count(), seq)
    seq.sort()
    if key is not None:
        seq = map(lambda decorated: decorated[2], seq)
    if reverse:
        seq.reverse()
    return seq
于 2012-07-03T04:49:16.347 に答える
0

次のように自分で書くことができますsorted()

try:
    sorted
except NameError:
    def sorted(seq, key=None):
        lst = list(seq)  # get copy of list
        if key is not None:
            def my_cmp(a, b):
                return cmp(key(a), key(b))
        else:
            my_cmp = cmp
        lst.sort(my_cmp)
        return lst

sorted()組み込みの がない場合にのみ、これは new を定義しますsorted()。まず、名前の評価を試み、sorted取得した場合は独自の名前NameErrorを定義します。map(None, seq)の値から新しいリストを作成するための高速な方法として使用していますseq

または、@gnibbler で提案されているように、効率を最大化するために Schwartzian Transform を使用する場合:

try:
    sorted
except NameError:
    import operator as op
    def sorted(seq, key=None):
        if key is not None:
            lst = [(key(x), x) for x in seq]
            lst.sort()
            return map(lambda x: x[1], lst)
        else:
            lst = list(seq) # get list from sequence
            lst.sort()
            return lst
于 2012-07-03T03:41:59.840 に答える