【问题标题】:Sorting functions in a list对列表中的函数进行排序
【发布时间】:2018-03-11 15:19:32
【问题描述】:

我正在学习 Python,我想了解更多关于如何对列表进行排序的信息。我知道在列表中排序字符串和列表中的列表以及列表中的整数等等有很多,但我想知道的是如何对列表中的 objects 进行排序(它可能有助于其他语言)。比如,假设我有这个:

import random

class Example()
    def __init__(self):
        self.choose_if_special = randint(0,10)
        self.special = None
    def see_if_special(self):
        """determines if it is special"""
        if self.choose_if_special == 3:
           self.special = True
        else:
           self.special = False

list = []
max_examples = 10
for i in range(0, max_examples):
    #pushes max_examples Example(s) to list list
    list.append(Example())
for j in list:
    #prints not sorted list
    print(j)

但是,如果我想先打印所有带有.special = True 的函数,还是最后打印呢?有没有特定的功能可以做到这一点?还是你必须做其他事情?我已经想到并查看了一些可能的解决方案,但为了确保我不会浪费我的时间,是否有一个函数可以在 Python 或它的一个库中执行此操作?如果不是,那么对列表进行排序的最快和最有效的方法是什么(所以它不会运行得更慢)?

【问题讨论】:

  • 您实际上是在哪里尝试对列表进行排序?您是否尝试过将 sortedsort 与关键参数一起使用?
  • Python 中的一切都是一个对象,因此当您进行常规整数排序 时,您实际上会像本例中那样对对象进行排序。您只需要了解两者是如何连接的。

标签: python sorting


【解决方案1】:

总而言之,您可以使用内置函数:sortsorted。不同的是,使用sort 会改变原来的列表,而使用sorted 不会。

首先,您需要为每个列表示例对象设置相应的 特殊 值:

for example in list:
    example.see_if_special()

之后,您可以在您的列表中添加sort

list.sort(key=lambda example: int(example.special), reverse=True)

或者在不修改原始列表的情况下生成一个新列表:

sorted(list, key=lambda example: int(example.special), reverse=True)

【讨论】:

    【解决方案2】:

    通过快速谷歌,我发现 Python 有一个名为 sorted 的函数,可以在这种情况下使用。在你的情况下:

    sorted_objects = sorted(list_of_objects, key=lambda object: object.special, reverse=True)
    

    【讨论】:

      【解决方案3】:

      如果你想在你自己的类中实现一个排序(不会改变),定义__lt__(对于<操作符),__lte__(对于<=操作符),__gt__对于> 运算符和 __gte__(对于 >= 运算符)。 j.sortsorted(j) 将自动使用您定义的顺序对列表进行排序。

      如果您想在整个代码中以不同的方式进行排序,请使用命名参数key=some_function(对于list.sortsorted)。 key 函数被赋予列表的一个元素,该函数的结果将用于决定如何排序。例如:

      for e in list:
          e.see_if_special()
      
      for e in sorted(list, key=lambda x: x.special):
          print(e)
      

      将首先打印具有.special == False 的所有元素,然后打印具有.special == True 的元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 2018-08-16
        • 1970-01-01
        • 2017-08-28
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多