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

Schwartzian 变换通常比使用参数更有效(cmp这是较新版本的 Python 在使用key参数时所做的)

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,根据这篇文章 Sorting a list of lists by item frequency in 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,如果我们得到 aNameError我们定义自己的名称。我正在使用map(None, seq)一种快速的方法来从seq.

或者,如果我们想按照@gnibbler 的建议使用 Schwartzian 变换以获得最大效率:

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 回答