2012-07-03 4 views
6

, 나는 다음과 같은 자신의 지난 몇 문자에 따라 분류 기능을 사용할 수 있어요 쉽게 문자열의 목록을 정렬합니다파이썬 정렬 마지막 문자 새로운 파이썬에서

lots_list=['anything'] 

print sorted(lots_list, key=returnlastchar) 

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

는 어떻게 위를 구현할 수 있습니다 lots_list.sort()은 구형 파이썬 (2.3)에서 사용됩니까?

"오류 :. 내가 the global name sorted is not definedsorted()를 사용했을 때"

감사합니다!

+4

: 여기에 드롭 인 교체합니다 (CMP paramenter 제외)입니까? – lucemia

+0

2.3 생각합니다. 나는 sorted()를 사용하는 것 같다. .sort() –

답변

8

Schwartzian transform은 일반적으로 더 효율적 cmp 인수

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

이 더 빠릅니다. 이전에 비해 [10 :] 부분 문자열이 실제로 적었 기 때문입니다. – zinking

+0

@ zinking, 꽤 많이. 'cmp'는'n * log (n)'회라고하기 때문에'returnlastchar'는'2 * n * log (n)'회라고합니다. –

0

당신과 같이 자신의 sorted()을 쓸 수 있습니다 (이것은 key 인수를 사용할 때 파이썬의 새로운 버전이 할 것입니다)를 사용하는 것보다 :

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으로 평가하고 NameError을 얻으면 우리 자신을 정의합니다. seq의 값을 새 목록으로 만드는 빠른 방법으로 map(None, seq)을 사용하고 있습니다.

또는, 우리가 @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

'itemgetter'가 파이썬 2.4까지 도입 된 것 같지 않습니다. – DSM

+0

@DSM : 오, 감사합니다. 나는 보통의 람다 (lambda)로 다시 쓴다. – steveha

1

그것은 당신이 의 자신의 버전 순으로 정렬되어있어 쓰기 어렵지 않다.

이 구형 파이썬 얼마나 오래
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 
관련 문제