【问题标题】:sort object based on attribute [duplicate]根据属性对对象进行排序[重复]
【发布时间】:2023-03-15 15:09:02
【问题描述】:

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

任何人都可以提出一个好的算法来打印姓名,同时他们的年龄按升序/降序排列吗? (同龄人的名字不需要在txt中保持顺序)

谢谢

【问题讨论】:

  • 你能给我们一个你的文件的例子吗?到目前为止你做了什么?
  • 问题是读取文件还是按元组的第二个元素对元组列表进行排序?
  • 如果你提供一些尝试,如果你得到一个好的答案,这将有助于你的机会
  • 谢谢,问题是排序。假设我们有 (a, 10), (b, 5), (c, 11)。需要一个算法将其排序为 (c, 11), (a, 10), (b,5)

标签: python sorting


【解决方案1】:

如果您将姓名/年龄放在字典中,例如(将取决于您的实际文件格式 - 以下假设每行名称后跟年龄,用空格分隔):

names = {}
with open('file.txt') as f:
    for line in f:
        name, age = line.split()
    names[name] = int(age)

然后很容易排序 - 按名称排序(不是您建议的,但仅供参考),使用:

sorted(names)

要按年龄排序,请更改用于排序的键:

sorted(names, key=lambda i: names[i])

因此,要打印,您可以使用:

for name in sorted(names, key=lambda i: names[i]):
    print(name, names[name])

【讨论】:

    【解决方案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 设置为按降序对元组进行排序。

    【讨论】:

    • 使用 operator.itemgetter 或 operator.attrgetter 代替 lambda。 (如果它是一个命名元组,则为 attrgetter)。它更惯用,也更快。
    • @AlexanderHuszagh 为什么我需要一个导入来完成如此琐碎的任务?
    • 因为这是内置库的重点。当然,您可以编写一个 lambda,但 itemgetter 是特定的,它很有用,而且速度也快了约 50%。
    • @AlexanderHuszagh 点。
    • @timgeb:补充 Alexander 的论点,itemgetter 做了一件事,如果我看到它,我知道它在做什么,不会被愚弄。不过,将lambda x: (x[1], -x[0], x[4]) 误认为lambda x: (x[1], x[0], x[4]) 确实很容易,所以对于未来的维护者,我会使用itemgetter(1, 0, 4) 来表示后者;仅使用lambda 表示“我正在做一些足够独特且不明显的事情,标准库不支持它,所以请注意”。
    【解决方案3】:

    timegeb 给出的the answer 的替代方法是使用operator 包中的itemgetter (documentation)。

    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 替代 lambda 表达式。

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 2017-09-06
      • 2012-10-22
      • 2017-07-18
      • 1970-01-01
      • 2021-07-14
      • 2018-11-14
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多