2008-10-30 7 views
0

J'écris un script Jython pour trier une liste d'URL.Tri de la liste des URL par longueur en Jython

J'ai une liste qui ressemble à ceci:

http://www.domain.com/folder1/folder2/|,1
http://www.domain.com/folder1/|,1
http://www.domain.com/folder1/folder2/folder3/|,1
http://www.domain.com/folder1/|,1
http://www.domain.com/folder1/folder2/|,1
http://www.domain.com/folder1/folder2/|,1
http://www.domain.com/folder1/folder2/folder3/|,1

Le canal et la virgule séparent le chemin de la quantité de fichiers qui se trouvent sous ce chemin. Est-il possible d'une façon ou d'utiliser Jython pour commander les URL de longueur, de sorte qu'il finirait par ressembler à la liste ci-dessous:

http://www.domain.com/folder1/|,1
http://www.domain.com/folder1/|,1
http://www.domain.com/folder1/folder2/|,1
http://www.domain.com/folder1/folder2/|,1
http://www.domain.com/folder1/folder2/|,1
http://www.domain.com/folder1/folder2/folder3/|,1
http://www.domain.com/folder1/folder2/folder3/|,1

J'espère que vous aurez ce que je veux dire, toute aide serait appréciée. Cheers

Répondre

3

Trier par longueur, en utilisant une fonction de tri:

urls.sort(lambda a, b: cmp(len(a), len(b))) 

Pour des performances, certains pourraient préférer le motif undecorate décorez-tri:

urllengths= [(len(url), url) for url in urls] 
urllengths.sort() 
urls= [url for (l, url) in urllengths] 

Ou comme une doublure:

urls= zip(*sorted((len(url), url) for url in urls))[1] 
+0

jython supporte un argument 'key' pour' sort() ', vous pouvez donc simplement utiliser:' urls.sort (key = len) '. – jfs

+0

seulement pris en charge depuis jython-2.5 pas sur la série 2.2 –

0

Ne pas les trier prendre soin de cela?

+0

Le dictionnaire anglais est triée, mais vous ne recevez pas tous les mots 1-lettre avant tous les mots de 2 lettres – Gareth

+0

True, mais dans les données de l'échantillon donné un tri fonctionnerait. –

1

jusqu'à attrape Jython jusqu'à python 2.4, vous ca nnot utiliser l'argument clé -list.sort():

mylist.sort(key=len) 

Alors, comme dans le bon vieux temps, nous avons l'idiome decorate-sort-undecorate. Pour trier mylist par la longueur de l'article, nous générons un decorated_list de (len(item),item) tuples, sorte que, et la bande de finalement les articles en arrière:

decorated_list = zip(map(len, mylist), mylist) 
decorated_list.sort() 
sorted_list = [i[1] for i in decorated_list] 
+0

Pour la symétrie, j'utiliserais: 'tried_list = map (opérateur.itemgetter (1), decorated_list) 'au lieu de' sorted_list = [i [1] pour i dans decorated_list] ' – jfs

+0

Ou (pour symétrie): decorated_list = zip ([len (i) pour i dans mylist], mylist) (Jython 2.2) – gimel

+0

Jython 2.2 n'a pas operator.itemgetter(). – jfs

Questions connexes