在较新的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
。”
谢谢!
答案 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