有没有不使用operator.itemgetter排序嵌套列表的方法?
我有一个文件要读取,然后我创建了嵌套列表,想要根据第四个元素(邮政编码)进行排序。
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']]
这一切都运行得很好,我只是想知道有没有办法不使用“import operator”来实现这个功能?
3 个回答
0
把你的子列表调整一下,把你想要排序的内容放在最前面。比如在你的例子中,邮政编码本来是第4个元素,现在应该变成第1个元素。这样你就可以直接对它们进行排序了。
当然,这种排序方式是否适合其他用途的数据也需要考虑一下。
4
一个大致的类似实现可以是:
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个元素的元组的随机列表,然后对这个列表进行1,000次的排序。我的MacBook Pro上使用Python 2.7.2,withlambda
版本大约需要55.4秒,而withgetter
版本大约需要46.1秒。
需要注意的是,当列表变得很大时,排序算法本身所花的时间增长得比提取键所花的时间要快。因此,如果你在排序很多小列表时,时间差异会更大。用1,000个元素的列表重复测试100,000次,withlambda
需要22.4秒,而withgetter
只需要12.5秒。
6
哦,是的,确实有办法:
print sorted(data,key=lambda x: x[4])