Как я могу отсортировать IP-адреса и целые числа в Python? - PullRequest
1 голос
/ 07 декабря 2010

У меня есть список IP-адресов и целых чисел, которые я бы хотел отсортировать по python по 4-му столбцу:

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

Проблема в том, что Python не может обрабатывать IP-адреса и целые числа в одном списке.Я могу сортировать только по алфавиту.Как мне сделать правильную сортировку на основе значения 4-го столбца Вот что у меня есть:

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

Ответы [ 6 ]

6 голосов
/ 07 декабря 2010

Это то, что вы ищете?

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
2 голосов
/ 07 декабря 2010
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

результаты:

[['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']]
1 голос
/ 07 декабря 2010

Не думаю, что вам нужно менять свои линии.Вы должны иметь возможность просто сортировать строки, используя

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

, предполагая, что у вас всегда есть целочисленное значение в вашем четвертом столбце.

Хорошая ссылка, обсуждающая последовательности Python и способы управления ими: Effbot

1 голос
/ 07 декабря 2010
lines = open("file.txt", "r").readlines()
lines=[x.split() for x in lines]
lines.sort(key=lambda l: int(l[3]), reverse=True)
1 голос
/ 07 декабря 2010

целые числа ip хранятся в строке, верно?а 4-й столбец является частью строки?однако вы можете сделать что-то вроде

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

или, если вам нужно больше контроля, вы можете определить функцию, которая принимает 2 строки и определить, какая из них максимальная, а затем передать эту функцию для сортировки аргумента cmp

0 голосов
/ 03 августа 2017

Я не смог найти простой и легкий способ сделать это в py без длинных сложных функций и лямбда-выражений,

самый простой способ на сегодняшний день,

pip install sh

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

ш модуль просто фантастический.

...