2012-07-03 41 views
6

Trong Python mới hơn, tôi có thể sử dụng chức năng sắp xếp và dễ dàng sắp xếp ra một danh sách các chuỗi theo vài ký tự cuối cùng của họ như vậy:Python Sắp xếp nhân vật cuối

lots_list=['anything'] 

print sorted(lots_list, key=returnlastchar) 

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

Làm thế nào tôi có thể thực hiện ở trên để lots_list.sort() được sử dụng trong Python cũ (2.3)?

"Lỗi: Khi tôi cố gắng sử dụng sorted(), the global name sorted is not defined."

Cảm ơn!

+4

bao nhiêu tuổi là python cũ của bạn? – lucemia

+0

2.3 Tôi nghĩ vậy. Tôi không thể sử dụng được sắp xếp(). Chỉ .sort() –

Trả lời

8

Các Schwartzian transform thường hiệu quả hơn bằng cách sử dụng cmp luận (Đây là những gì các phiên bản mới hơn của Python làm khi sử dụng lập luận 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] 
+0

là nhanh hơn bởi vì nó thực sự đã làm ít hơn một chuỗi con [10:] so với trước đó? – zinking

+0

@zinking, khá nhiều. 'cmp' được gọi là' n * log (n) 'lần, vì vậy' returnlastchar' sẽ được gọi là '2 * n * log (n)' lần. –

0

Bạn có thể viết riêng sorted() của bạn như vậy là:

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 

Điều này sẽ chỉ xác định sorted() mới nếu không có tích hợp sorted(). Trước tiên, chúng tôi cố gắng đánh giá tên sorted và nếu chúng tôi nhận được NameError, chúng tôi sẽ tự định nghĩa. Tôi đang sử dụng map(None, seq) như một cách nhanh chóng để tạo danh sách mới trong số các giá trị của seq.

Hoặc, nếu chúng ta muốn sử dụng Schwartzian Biến đổi cho hiệu quả tối đa theo đề nghị của @gnibbler:

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 
+0

Tôi không nghĩ 'itemgetter' được giới thiệu cho đến Python 2.4. – DSM

+0

@DSM: Ồ, cảm ơn. Tôi sẽ viết lại với thông thường 'lambda'. – steveha

1

Nó không khó để viết bạn phiên bản riêng của sắp xếp. Đây là một sự thay thế thả-in (trừ cmp paramenter):

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 
Các vấn đề liên quan