按照键排序打印字典的项目
按照键排序打印字典的项目
class Company(object): def __init__(self, name): self.name = name self.employees = {} def addEmployee(self, id, name): self.employees[id] = name def displayEmployees(self): for k,v in sorted(self.employees.items()): print(k, '\t', v) a = Company('The Company') a.addEmployee(111, 'Employee1') a.addEmployee(222, 'Employee2') a.addEmployee(333, 'Employee3') a.displayEmployees()
有没有其他方法可以按照键对字典进行排序,以保持以下输出,而不使用新变量?:
111 Employee1 222 Employee2 333 Employee3
问题的原因:正常的字典不会记住键的顺序,如果在代码的其余部分中保持字典的顺序对您很重要,可以使用Python的collections模块中的OrderedDict作为一个替代方案。
解决方法:在添加员工时使用OrderedDict,并在打印时排序。
以下是解决方法的代码示例:
from collections import OrderedDict # ... def addEmployee(self, id, name): self.employees[id] = name self.employees = OrderedDict(sorted(self.employees.items()))
这将始终保持self.employees字典的顺序,并将显示代码简化为:
def displayEmployees(self): for k,v in self.employees.items(): print(k, '\t', v)
然而,每次都创建一个全新的字典是低效的,如果只是为了打印,可以在打印时排序。
对于功能来说,只有当顺序对其重要时才使用OrderedDict,而不仅仅是用于打印。
在上述代码中,问题是要按照字典的键对字典的项进行排序并打印出来。
问题的原因是字典的键没有按照特定的顺序进行排列,而是以无序的方式存储。因此,如果想要按照键的顺序打印出字典的项,就需要对键进行排序。
解决方法之一是使用sorted()
函数对字典的键进行排序,然后通过键来查找对应的值并打印出来。以下是一个使用这种方法的示例代码:
def displayEmployees(self): for key in sorted(self.employees): print(key, self.employees[key], sep='\t')
另一个解决方法是在遍历字典的项时,使用items()
方法返回的键值对,然后使用sorted()
函数对键值对进行排序。以下是一个使用这种方法的示例代码:
def displayEmployees(self): for key, value in sorted(self.employees.items()): print(key, value, sep='\t')
使用上述方法之一,就可以按照字典的键的顺序打印出字典的项。
在这段代码中,出现了一个问题:如何按照字典键值的顺序打印字典项。为了解决这个问题,作者使用了一个名为"timsort"的排序算法,并在代码中添加了一个标志来确定是否对字典键进行排序。
解决方法是在添加新的员工时,将员工的id和名字分别添加到两个列表中,并将它们作为键值对存储在一个字典中。然后,使用Python的排序算法"timsort"对这两个列表进行排序,并按照排序后的顺序打印出字典项。
这种方法的好处是,在添加新的员工时,时间复杂度为O(N),而如果每次插入后都对列表进行排序,时间复杂度将变为O(N平方)。虽然使用"timsort"算法进行排序会导致"displayEmployees"方法的最坏情况时间复杂度为O(N log N),但由于"timsort"在实际场景中具有出色的性能,所以通常会比O(N log N)更快。
"timsort"算法是由Tim Peters发明的,因此得名为"timsort"。它是Python中的一种排序算法,被广泛应用于Java中的数组对象的排序。作者提到了Josh Bloch,他是Java领域的知名人士,当时作为Google的员工,在一个技术讲座上介绍了Python的"timsort",并对它产生了浓厚的兴趣。
还有在Python社区中,Tim Peters被尊称为"the timbot",因为他能够快速且准确地回答很多技术问题。而作者自己则被尊称为"the martellibot",但他承认自己没有开发出像"timsort"这样酷的算法。
总之,作者建议不要使用"bisect"来维护一个按照顺序排列的列表,因为在大多数情况下,直接将新的元素追加到列表末尾,然后按需排序是最好的选择。在某些特殊情况下,可以使用标准库中的"heapq"模块来插入元素,其时间复杂度为O(log N),而不是像"bisect"那样的O(N)。
最后,作者提到了"self.sorted"标志,它只是一个微小的优化,只有在多次连续调用"displayEmployees"而没有调用"addEmployee"的情况下才值得使用。如果不会出现这种情况,可以简化代码并省略该标志,不会对大O的行为产生影响。