繁体   English   中英

如何对 object 中包含的列表进行排序

[英]how to sort a list that is contained in an object

任务是使用以下代码作为起点编写排序算法。 问题是我似乎无法弄清楚我是如何启动代码的 go,我不是在寻找完整的解决方案 - 只是如何对实际上是 object 一部分的元组列表进行排序的技术。 当我尝试遍历列表时出现错误,说无法遍历 object。

class LinkedList:
    def __init__(self, data):
        self.label = data[0][0]
        self.value = data[0][1]
        self.tail = None if (len(data) == 1) else LinkedList(data[1:])

countries = LinkedList([("Ukraine",41879904),("Brunei",442400),("Christmas Island (Australia)",1928)

您可以使用指针来遍历链表。:

curr = countries

while curr:
    print("Label {}, Value {}".format(curr.label, curr.value))
    curr = curr.tail

为了对链表进行排序,首先,您需要实现帮助函数来删除/插入节点到某个 position 的给定链表。 一旦你有了这样的方法,你就可以使用你刚刚创建的辅助方法来实现任何著名的排序算法(例如快速排序)。

要遍历此列表,您需要继续获取 object 的尾部引用:

class LinkedList:
  def __init__(self, data):
    self.label = data[0][0]
    self.value = data[0][1]
    self.tail = None if (len(data) == 1) else LinkedList(data[1:])

countries = LinkedList([("Ukraine",41879904),("Brunei",442400),("Christmas Island (Australia)",1928)])
nextObj = countries

while nextObj is not None:
  print(nextObj.label, nextObj.value)
  nextObj = nextObj.tail

print("done!")

output:

Ukraine 41879904
Brunei 442400
Christmas Island (Australia) 1928
done!

要获取某个索引处的元素,您从第一个元素开始迭代并保留一个计数器。

功能工具,@total_ordering

python 中的强大功能之一。 您可以以经典且简单的方式对对象进行排序。 python 中的 Functools 模块有助于实现高阶功能。 高阶函数是调用其他函数的依赖函数。 Total_ordering 提供了丰富的 class 比较方法,有助于比较类,而无需为其显式定义 function。 因此,它有助于代码的冗余。

实施这些比较方法有两个基本条件

必须从lt (小于)、le(小于或等于)、gt(大于)或ge(大于或等于)中定义至少一种比较方法。

还必须定义eq function

from functools import total_ordering

@total_ordering
class LinkedList(object):
    def __init__(self, data):
        self.label = data[0][0]
        self.value = data[0][1]

    def __lt__(self, other):
        return self.label < other.value  ##lets assume that the sort is based on label data member(attribute)

    def __eq__(self, other):
        return self.label == other.value

##I dont know what data is. just pass your data objects to list of LinkedList objects. and sort it with sorted method (treat them like int objects)! 
my_list = [LinkedList(data0),LinkedList(data1),LinkedList(data2)]

new_list=my_list.sorted()
for obj in new_list:
    print(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM