按照键排序打印字典的项目

8 浏览
0 Comments

按照键排序打印字典的项目

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

0
0 Comments

问题的原因:正常的字典不会记住键的顺序,如果在代码的其余部分中保持字典的顺序对您很重要,可以使用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,而不仅仅是用于打印。

0
0 Comments

在上述代码中,问题是要按照字典的键对字典的项进行排序并打印出来。

问题的原因是字典的键没有按照特定的顺序进行排列,而是以无序的方式存储。因此,如果想要按照键的顺序打印出字典的项,就需要对键进行排序。

解决方法之一是使用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')

使用上述方法之一,就可以按照字典的键的顺序打印出字典的项。

0
0 Comments

在这段代码中,出现了一个问题:如何按照字典键值的顺序打印字典项。为了解决这个问题,作者使用了一个名为"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的行为产生影响。

0