在__iter__上对字典进行排序
时间:2020-03-06 14:26:14 来源:igfitidea点击:
我正在尝试根据其键对字典进行排序,并从类的重写iter方法中将迭代器返回到值。有没有比创建新列表,在我对键进行排序时插入列表中更好,更有效的方法了?
解决方案
到目前为止,最简单的方法,几乎可以肯定是最快的方法是:
def sorted_dict(d): keys = d.keys() keys.sort() for key in keys: yield d[key]
我们必须先获取所有键才能进行排序。将所有键都提取到列表中,然后对该列表进行排序是最有效的方法。列表排序非常快,因此以最快的速度获取键列表。然后,我们可以创建一个新的值列表,也可以像示例中那样产生值。请记住,如果要遍历字典,则无法对其进行修改(下一次迭代将失败),因此,如果要在完成对sorted_dict()结果的修改之前对字典进行修改,请使其返回列表。
这样的事情怎么样:
def itersorted(d): for key in sorted(d): yield d[key]
假设我们想要默认的排序顺序,则可以使用sorted(list)或者list.sort()。如果我们需要自己的排序逻辑,则Python列表支持根据传入的函数进行排序的功能。例如,以下方法将是使用函数从最小到最大(默认行为)对数字进行排序的一种方法。
def compareTwo(a, b): if a > b: return 1 if a == b: return 0 if a < b: return -1 List.Sort(compareTwo) print a
从概念上讲,此方法比手动创建新列表并添加新值更干净,并且允许我们控制排序逻辑。
def sortedDict(dictobj): return (value for key, value in sorted(dictobj.iteritems()))
这将创建一个中间列表," sorted()"方法返回一个真实列表。但至少它只是一个。