2012-07-03 24 views
6

, ben gibi son birkaç karakter göre sıralanır işlevi kullanmak mümkün ve kolay bir ip listesini sıralar:Python sırala Son Karakterler yeni Python

lots_list=['anything'] 

print sorted(lots_list, key=returnlastchar) 

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

nasıl yukarıdaki uygulayabilirsiniz lots_list.sort() Daha eski Python'da (2.3) kullanılıyor mu?

"Hata:. Ben, the global name sorted is not definedsorted() kullanılarak çalıştığımızda"

Teşekkür!

+4

: İşte drop-in yerine (cmp parametresine hariç) nedir? – lucemia

+0

2.3 Sanırım. Ben sıralanmış() kullanamıyorum. Sadece .sort() –

cevap

8

Schwartzian transform genellikle daha verimli cmp argüman

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

bu daha hızlıdır, çünkü bir öncekine kıyasla daha az alt tabaka [10:] yapmıştır? – zinking

+0

@zinking, oldukça fazla. 'cmp'' n * log (n) 'kere çağrılır, bu yüzden' returnlastchar' '2 * n * log (n)' kere çağrılırdı. –

0

Öyle gibi kendi sorted() yazabilir (Bu key argüman kullanıldığında Python yeni sürümleri işidir) kullanmaktan daha geçerli:

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 

Bu yalnızca tanımlayacak yeni adres sorted() hiçbir yerleşikvarsa. İlk olarak, sorted ismini değerlendirmeye çalıştık ve eğer bir NameError alırsak kendimizi tanımlarız. seq değerlerinden yeni bir liste yapmak için map(None, seq) kullanıyorum.

Ya da, @gnibbler önerdiği gibi Schwartzian maksimum verim için Transform kullanmak istiyorsanız:

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

Python 2.4'e kadar "itemgetter" ın tanıtıldığını sanmıyorum. – DSM

+0

@DSM: Oh, teşekkürler. Her zamanki lambda ile yeniden yazacağım. – steveha

1

Size kendi versiyonunu sıralanmış konum yazmak için zor değil.

senin eski piton kaç yaşında
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