有没有办法在不使用operator.itemgetter的情况下对嵌套列表进行排序?

时间:2011-11-03 21:53:02

标签: python sorting nested-lists

我有一个我正在阅读的文件,然后创建嵌套列表,然后我想对4元素进行排序(zipcode)

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 个答案:

答案 0 :(得分:6)

哦,是的,有办法:

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

答案 1 :(得分:3)

粗略的工作方式是:

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() 1,000次。在我的带有Python 2.7.2的MacBook Pro上,withlambda版本运行大约55.4秒,withgetter运行大约46.1秒。

请注意,随着列表变大,排序算法本身所花费的时间比获取密钥所花费的时间增长得更快。因此,如果你要排序很多小清单,差异就会大得多。使用1,000个项目列表运行相同的测试重复100,000次,withlambda产生22.4s而withgetter产生12.5s。

答案 2 :(得分:0)

构建或重新组织子列表,以便首先排序要排序的事物。在您的情况下,邮政编码而不是元素4应该是元素0.然后您可以对它们进行排序。

当然,也必须考虑这种排序对数据其他用途的适用性。