Есть ли способ сортировки вложенных списков без использования operator.itemgetter? - PullRequest
1 голос
/ 04 ноября 2011

У меня есть файл, который я читаю, затем создаю вложенные списки, которые хочу отсортировать по 4 элементам (почтовый индекс)

jk43:23 Marfield Lane:Plainview:NY:10023
axe99:315 W. 115th Street, Apt. 11B:New York:NY:10027
jab44:23 Rivington Street, Apt. 3R:New York:NY:10002
ap172:19 Boxer Rd.:New York:NY:10005
jb23:115 Karas Dr.:Jersey City:NJ:07127
jb29:119 Xylon Dr.:Jersey City:NJ:07127
ak9:234 Main Street:Philadelphia:PA:08990

Вот мой код:

ex3_3 = open('ex1.txt')
exw = open('ex2_sorted.txt', 'w')

data = []
for line in ex3_3:
    items = line.rstrip().split(':')
    data.append(items)
print sorted(data, key=operator.itemgetter(4))

Выход:

[['jb23', '115 Karas Dr.', 'Jersey City', 'NJ', '07127'], ['jb29', '119 Xylon Dr.', 'Jersey City', 'NJ', '07127'], ['ak9', '234 Main Street', 'Philadelphia', 'PA', '08990'], ['jab44', '23 Rivington Street, Apt. 3R', 'New York', 'NY', '10002'], ['ap172', '19 Boxer Rd.', 'New York', 'NY', '10005'], ['jk43', '23 Marfield Lane', 'Plainview', 'NY', '10023'], ['axe99', '315 W. 115th Street, Apt. 11B', 'New York', 'NY', '10027']]

все это работает нормально, мне просто интересно, есть ли способ сделать это без использования оператора импорта?

Ответы [ 3 ]

6 голосов
/ 04 ноября 2011

О да, есть способ:

print sorted(data,key=lambda x: x[4])
3 голосов
/ 04 ноября 2011

Грубый рабочий аналог будет:

print sorted(data, key=lambda items: items[4])

но operator.itemgetter немного быстрее. Я использую эту программу для сравнения обоих подходов:

#!/usr/bin/env python

import timeit

withlambda = 'lst.sort(key=lambda items: items[4])'
withgetter = 'lst.sort(key=operator.itemgetter(4))'

setup = """\
import random
import operator
random.seed(0)
lst = [(random.randrange(100000), random.randrange(100000), random.randrange(100000), random.randrange(100000) ,random.randrange(100000))
       for _ in range(10000)]
"""

n = 10000

print "With lambda:"
print timeit.timeit(withlambda, setup, number=n)

print "With getter:"
print timeit.timeit(withgetter, setup, number=n)

Создает случайный список из 100 000 кортежей из 5 элементов, а затем запускает sort() в списке 1000 раз. На моем MacBook Pro с Python 2.7.2 версия withlambda работает примерно за 55.4 с, а withgetter - за 46.1 с.

Обратите внимание, что по мере увеличения списков время, затрачиваемое в самом алгоритме сортировки, увеличивается быстрее, чем время, затрачиваемое на выбор ключей. Следовательно, разница намного больше, если вы сортируете много маленьких списков. Выполнение того же теста со списком из 1000 элементов, повторенным 100 000 раз, дает 22,4 с для withlambda против 12,5 с для withgetter.

0 голосов
/ 04 ноября 2011

Создайте или реорганизуйте свой подсписок так, чтобы вещь, по которой вы хотите отсортировать, была первой.В вашем случае почтовый индекс, а не элемент 4, должен быть элементом 0. Затем вы можете просто отсортировать их.

Конечно, следует также учитывать пригодность этого порядка для других видов использования данных.1003 *

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