【问题标题】:Sorting dictionary for printing用于打印的排序字典
【发布时间】:2014-03-28 10:21:41
【问题描述】:

我想打印一个排序字典,其中包含很多键值对(~2000)。 每对都包含一个作为键的数字和一个作为值的字符串。 这只是关于打印,我实际上不想对字典进行排序。

如果我使用sorted() 方法,python 会对我的字典进行排序,但方式很尴尬:

{'0':'foo', '1':'bar', '10': 'foofoo', '100': 'foobar', '1000': 'barbar', 
 '1001': 'barfoo', '1002': 'raboof', ...}

但我想像这样以“常规”方式对其进行排序:

{'0':'foo', '1':'bar', '2': 'foofoo', '3': 'foobar', '4': 'barbar', 
 '5': 'barfoo', ... , '1001': 'raboof'}

我可以强制该方法按照我想要的方式运行,还是有其他更好的解决方案?

【问题讨论】:

  • 为什么不使用列表呢?您的数字似乎是连续的,为什么要使用字典?
  • 因为它比列表加载值更快。
  • 不适用于索引,它不是。 listobj[10] 将比 dictobj['10'] 更快地返回第 11 个值,因为字典必须首先对键进行散列和扰动。
  • 哦,好的,谢谢...不知道
  • 但是用信息填充列表将比字典花费更长的时间,顺便说一句......

标签: python sorting dictionary printing


【解决方案1】:

您的键是表示整数的字符串;如果您想要数字排序,请使用int() 将键转换为整数:

sorted(yourdict, key=int)

为您提供按数字排序的键列表和

sorted(yourdict.items(), key=lambda i: int(i[0]))

为您提供按键的数值排序的项目。

但是,如果您有从 0 开始的连续键,则应该使用列表对象。索引引用比字典查找更快,因为不需要散列步骤。

即使您的键不是从 0 开始但仍然是连续的,对于一个小的开始索引,您只需用 None 值填充列表:

[None, 'foo', 'bar', 'foofoo', ...]

并从 1 开始索引。

【讨论】:

    【解决方案2】:

    您无法对字典进行排序,因为它们自然是无序的(它们在内部使用散列),但您可以以排序方式打印键值对

    print sorted(d.items(), key = lambda x: int(x[0]))
    

    输出

    [('0', 'foo'),
     ('1', 'bar'),
     ('10', 'foofoo'),
     ('100', 'foobar'),
     ('1000', 'barbar'),
     ('1001', 'barfoo'),
     ('1002', 'raboof')]
    

    如果您想以排序方式遍历字典,默认情况下,那么您可以使用来自this answer 的自定义SortedDict

    此外,您可以像这样以排序方式打印字典

    print "{{{}}}".format(", ".join(["{!r}: {!r}".format(key, d[key]) for key in sorted(d, key=int)]))
    # {'0': 'foo', '1': 'bar', '10': 'foofoo', '100': 'foobar', '1000': 'barbar', '1001': 'barfoo', '1002': 'raboof'}
    

    【讨论】:

    • 你的SortedDict 需要支持key 函数。
    【解决方案3】:

    您不需要使用字符串作为键。您可以使用整数:

    dct = {0:'foo', 1:'bar', 10: 'foofoo', 2: 'foo2'}
    

    如果您需要字符串,请将@​​987654322@ 参数添加到sorted()。在您的情况下,它将是 int 用于转换字符串 int 整数:

    sorted(dct, key=int)
    

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2015-02-24
      相关资源
      最近更新 更多