在__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()"方法返回一个真实列表。但至少它只是一个。