Python排序最后的字符

时间:2012-07-03 03:16:30

标签: python string sorting python-2.3

在较新的Python中,我可以使用sorted函数,并根据最后几个字符轻松地排序字符串列表:

lots_list=['anything']

print sorted(lots_list, key=returnlastchar)

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

如何将上述内容实现到旧版Python(2.3)中使用的lots_list.sort()

“错误:当我尝试使用sorted()时,the global name sorted is not defined。”

谢谢!

4 个答案:

答案 0 :(得分:8)

Schwartzian transform通常比使用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]

答案 1 :(得分:5)

根据这篇文章,我手头没有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)

答案 2 :(得分:1)

为您编写排序的自己版本并不难。这是一个直接替换(不包括 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

答案 3 :(得分: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(),这只会定义您的新sorted()。首先,我们尝试评估名称sorted,如果我们得到NameError,我们会定义自己的名称。我正在使用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