假设我有一个txt文件,每行包含一个名称和年龄(名称总是唯一的,但年龄可以相同)。
有人建议使用一个好的算法来打印出名字,而他们的年龄是按升序/降序排列的吗? (年龄相同的人的姓名不需要在txt中保留订单)
由于
答案 0 :(得分:4)
timegeb提供的the answer的替代方法是使用#googtrans(en|fr)
包中的itemgetter
(documentation)。
operator
哪个会给你完全相同的结果
from operator import itemgetter
people = [('bob', 28), ('alice', 21), ('jeff', 78)]
print(sorted(people, key=itemgetter(1), reverse=True))
[('jeff', 78), ('bob', 28), ('alice', 21)]
可替代itemgetter
表达式。
答案 1 :(得分:2)
谢谢,问题是排序。假设我们有(a,10),(b,5),(c,11)。需要一种算法将其排序为(c,11),(a,10),(b,5)
好吧,我假设你在列表中有这些元组。您可以使用内置的sorted
函数并为其指定一个键函数,该函数指定列表元素的排序属性。
>>> people = [('bob', 28), ('alice', 21), ('jeff', 78)]
>>> sorted(people, key=lambda tup: tup[1], reverse=True)
[('jeff', 78), ('bob', 28), ('alice', 21)]
这里lambda tup: tup[1]
将返回每个元组的第二个元素。这是元组排序的值。 reverse=True
设置为按降序对元组进行排序。
答案 2 :(得分:1)
如果你把名字/年龄放在一个字典中(类似于你的实际文件格式 - 下面假设一个名字后跟每行的年龄,用空格分隔):
names = {}
with open('file.txt') as f:
for line in f:
name, age = line.split()
names[name] = int(age)
然后很容易排序 - 按名称排序(不是你建议的,只是FYI),使用:
sorted(names)
要按年龄排序,请更改用于排序的键:
sorted(names, key=lambda i: names[i])
因此,要打印,您可以使用:
for name in sorted(names, key=lambda i: names[i]):
print(name, names[name])