2010-12-07 51 views
1

J'ai une liste d'adresses IP et des entiers que je voudrais python pour trier par la 4ème colonne:Comment trier les adresses IP et les entiers en Python?

172.2.174.86 172.2.15.65 69694 42272874

172.2.200.100 172.2.15.20 14 4326

10.1.162.12 172.2.15.162 4741 170676

172.2.174.86 172.2.15.64 46021 33956341

10.1.167.237 172.2.15.69 921 133574

Le problème est que Python n'arrive pas à gérer les adresses IP et les entiers dans la même liste. Je peux seulement trier par ordre alphabétique. Comment puis-je faire le tri approprié en fonction de la valeur de la colonne 4 Voici ce que j'ai:

lines = open("file.txt", "r").readlines() 

lines=[x.split() for x in lines] 

for i in lines: 
i.reverse() 

lines.sort(cmp, reverse=True) 

for i in lines: 
print i 

Répondre

2
import csv 

with open("file.txt") as f: 
    data = list(csv.reader(f, delimiter=' ')) 

def intkey(row): 
    return int(row[3]) 

data.sort(key=intkey, reverse=True) 
print data 

les résultats:

[['172.2.174.86', '172.2.15.65', '69694', '42272874'], 
['172.2.174.86', '172.2.15.64', '46021', '33956341'], 
['10.1.162.12', '172.2.15.162', '4741', '170676'], 
['10.1.167.237', '172.2.15.69', '921', '133574'], 
['172.2.200.100', '172.2.15.20', '14', '4326']] 
6

est le suivant ce que vous êtes après ?

lines = open("file.txt", "r").readlines() 
lines = [x.split() for x in lines] 
lines.sort(cmp, key=lambda x:int(x[3])) 
for i in lines: 
    print i 
+0

Merci beaucoup, c'est ce que j'ai fait! Exactement ce dont j'avais besoin – briandowd

+0

De rien. – NPE

1

vos entiers IP sont stockés dans une chaîne, non? et la 4ème colonne fait partie de la chaîne? mais vous pouvez faire quelque chose comme

l.sort(key=lambda x:x.split()[3], reverse=True) 

ou si vous voulez plus de contrôle, vous pouvez définir une fonction qui prend 2 chaîne et de déterminer Wich est le plus élevé, puis passer cette func pour trier argument cmp

1
lines = open("file.txt", "r").readlines() 
lines=[x.split() for x in lines] 
lines.sort(key=lambda l: int(l[3]), reverse=True) 
+0

Oui, fait l'affaire. Merci beaucoup! – briandowd

1

Je ne pense pas que vous devez inverser vos lignes. Vous devriez pouvoir simplement trier les lignes en utilisant

lines.sort(lambda x, y: cmp(int(x[3]), int(y[3]))) 

en supposant que vous avez toujours une valeur intégrale dans votre quatrième colonne.

Bonne liaison discuter des séquences Python et comment les manipuler: Effbot

+0

merci pour le lien. V utile pour un novice. – briandowd

0

Je ne pourrais pas trouver propre moyen facile de le faire dans py w/o fonctions longues et complexes et lambdas,

meilleure façon de loin,

Pip installer sh

from sh import sort 
sort('-nr', '/tmp/file1', '-o', '/tmp/file1') 

module sh est fantast ic.