составная сортировка в питоне - PullRequest
1 голос
/ 28 июня 2009

У меня есть скрипт Python, который выводит много данных, пример, как показано ниже. первое из 4 полей всегда состоит из двух букв, одной цифры, косой черты и одной или двух цифр

Gi3/2 --.--.--.-- 0024.e89b.c10e Dell Inc.  
Gi5/4 --.--.--.-- 0030.c1cd.f038 HEWLETTPACKARD   
Gi4/3 --.--.--.-- 0020.ac00.6703 INTERFLEX DATENSYSTEME GMBH  
Gi3/7 --.--.--.-- 0009.4392.34f2 Cisco Systems  
Gi6/6 --.--.--.-- 001c.2333.bd5a Dell Inc  
Gi3/16 --.--.--.-- 0009.7c92.7af2 Cisco Systems  
Gi5/12 --.--.--.-- 0020.ac00.3fb0 INTERFLEX DATENSYSTEME GMBH  
Gi4/5 --.--.--.-- 0009.4392.6db2 Cisco Systems  
Gi4/6 --.--.--.-- 000b.cd39.c7c8 Hewlett Packard  
Gi6/4 --.--.--.-- 0021.70d7.8d33 Dell Inc  
Gi6/14 --.--.--.-- 0009.7c91.fa71 Cisco Systems  

Какой будет лучший способ правильно отсортировать это в первом поле, чтобы этот пример читал

Gi3/2   --.--.--.-- 0024.e89b.c10e  Dell Inc.  
Gi3/7   --.--.--.-- 0009.4392.34f2  Cisco Systems  
Gi3/16  --.--.--.-- 0009.7c92.7af2  Cisco Systems  
Gi4/3   --.--.--.-- 0020.ac00.6703  INTERFLEX DATENSYSTEME GMBH  
Gi4/5   --.--.--.-- 0009.4392.6db2  Cisco Systems  
Gi4/6   --.--.--.-- 000b.cd39.c7c8  Hewlett Packard  
Gi5/4   --.--.--.-- 0030.c1cd.f038  HEWLETT PACKARD  
Gi5/12  --.--.--.-- 0020.ac00.3fb0  INTERFLEX DATENSYSTEME GMBH  
Gi6/14  --.--.--.-- 0009.7c91.fa71  Cisco Systems  
Gi6/4   --.--.--.-- 0021.70d7.8d33  Dell Inc  
Gi6/6   --.--.--.-- 001c.2333.bd5a  Dell Inc  

Мои усилия были очень беспорядочными, и в результате число, например, 12, предшествовало 5!

Как всегда, большое спасибо за ваше терпение.

Ответы [ 4 ]

5 голосов
/ 28 июня 2009
def lineKey (line):
    keyStr, rest = line.split(' ', 1)
    a, b = keyStr.split('/', 1)
    return (a, int(b))

sorted(lines, key=lineKey)
4 голосов
/ 28 июня 2009

для сортировки разбить каждую строку так, чтобы у вас было два кортежа, часть до / и целая часть после этого, поэтому каждая строка должна быть отсортирована по чему-то вроде ('Gi6', 12), см. Пример ниже

s="""Gi3/2 --.--.--.-- 0024.e89b.c10e Dell Inc.  
Gi5/4 --.--.--.-- 0030.c1cd.f038 HEWLETTPACKARD   
Gi4/3 --.--.--.-- 0020.ac00.6703 INTERFLEX DATENSYSTEME GMBH  
Gi3/7 --.--.--.-- 0009.4392.34f2 Cisco Systems  
Gi6/6 --.--.--.-- 001c.2333.bd5a Dell Inc  
Gi3/16 --.--.--.-- 0009.7c92.7af2 Cisco Systems  
Gi5/12 --.--.--.-- 0020.ac00.3fb0 INTERFLEX DATENSYSTEME GMBH  
Gi4/5 --.--.--.-- 0009.4392.6db2 Cisco Systems  
Gi4/6 --.--.--.-- 000b.cd39.c7c8 Hewlett Packard  
Gi6/4 --.--.--.-- 0021.70d7.8d33 Dell Inc  
Gi6/14 --.--.--.-- 0009.7c91.fa71 Cisco Systems"""

lines = s.split("\n")
def sortKey(l):
    a,b = l.split("/")
    b=int(b[:2].strip())
    return (a,b)

lines.sort(key=sortKey)

for l in lines: print l
1 голос
/ 28 июня 2009

Вы можете определить cmp() функцию сравнения для .sort([cmp[, key[, reverse]]]) вызовов:

Метод sort () принимает необязательные аргументы для управления сравнениями.

cmp определяет пользовательскую функцию сравнения двух аргументов (элементов списка), которая должна возвращать отрицательное, нулевое или положительное число в зависимости от того, считается ли первый аргумент меньшим, равным или большим, чем второй аргумент: cmp= лямбда x, y: cmp (x.lower (), y.lower ()).Значением по умолчанию является None.

В функции cmp() найдите цифровую клавишу и используйте int(field) для обеспечения числового (не текстового) сравнения.

Альтернативно, a key() функция может быть определена (спасибо, @ Anurag Uniyal):

key определяет функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента списка: (например key=str.lower).Значением по умолчанию является None.

0 голосов
/ 28 июня 2009

Если вы работаете в среде Unix, вы можете использовать «сортировку» для сортировки таких списков.

Другая возможность заключается в использовании некоторой сортировки сегментов в вашем скрипте Python, которая должна быть намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...