2012-07-03 6 views
6

は、私のような彼らの最後の数文字に応じてソート機能を使用することができていますし、簡単に文字列のリストをソートします。Pythonのソート最終文字の新しいPythonで

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を使用してみました。"

ありがとう!私は手でのpython 2.3を持っていない

+4

あなたの古いPythonは何歳ですか? – lucemia

+0

2.3だと思います。私はソートされた()を使用するように思えない。 .sort() –

答えて

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

は以前のものと比較して実際には部分文字列[10:]が少ないため、これは高速ですか? – zinking

+0

@zinking、かなり。 'cmp'は' n * log(n) '回と呼ばれ、' returnlastchar'は '2 * n * log(n)'回と呼ばれます。 –

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という名前を評価しようとします。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'はPython 2.4まで導入されたとは思いません。 – DSM

+0

@DSM:ありがとう。私は通常のラムダで書き直します。 – steveha

1

それはあなたがの独自のバージョンをソートだ書くことは難しいことではありません。ここでは、ドロップイン置換(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