基于属性排序对象

时间:2015-12-22 23:57:30

标签: python sorting

假设我有一个txt文件,每行包含一个名称和年龄(名称总是唯一的,但年龄可以相同)。

有人建议使用一个好的算法来打印出名字,而他们的年龄是按升序/降序排列的吗? (年龄相同的人的姓名不需要在txt中保留订单)

由于

3 个答案:

答案 0 :(得分:4)

timegeb提供的the answer的替代方法是使用#googtrans(en|fr) 包中的itemgetterdocumentation)。

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])