【问题标题】:Python: OrderedDictionary sorting based on length of key's valuePython:基于键值长度的 OrderedDictionary 排序
【发布时间】:2012-10-05 23:29:40
【问题描述】:

我有一个这样的对象:

t = {'rand_key_1': ['x'], 'rand_key_2': [13,23], 'rand_key_3': [(1)], 'rk5': [1,100,3,4,3,3]}

具有随机键(字符串和/或 int)的字典,所有键都有一个列表作为值,大小不一。

我想把这本字典变成一个 OrderedDict,它的排序取决于字典项列表的长度。所以订购后我想得到:

t_ordered = {'rk5': ..., 'rand_key_2': .., 'rand_key_1': .., 'rand_key_3': ..}

(如果两个或多个项目具有相同的值,则它们的顺序并不重要。

我试过了,但我失败了:

OrderedDict(sorted(d, key=lambda t: len(t[1])))

我没有经验,如果我尝试的是超级愚蠢,请原谅。

我能做什么?

谢谢。

【问题讨论】:

    标签: python python-2.7 sorting dictionary ordereddictionary


    【解决方案1】:

    您实际上非常接近您传递给sorted 的排序函数。需要注意的是, sorted 将按顺序返回字典 keys 的可交互对象。因此,如果我们修复您的函数以使用每个键索引字典:

    >>> sorted(t, key=lambda k: len(t[k]))
    ['rand_key_3', 'rand_key_1', 'rand_key_2', 'rk5']
    

    您还可以指定键以相反的顺序返回并直接遍历这些键:

    >>> for sorted_key in sorted(t, key=lambda k: len(t[k]), reverse=True):
    ...     print sorted_key, t[sorted_key]
    
    rk5 [1, 100, 3, 4, 3, 3]
    rand_key_2 [13, 23]
    rand_key_3 [1]
    rand_key_1 ['x']
    

    通常您不需要创建 OrderedDict,因为您只需使用最新的字典数据迭代一个新的排序列表。

    【讨论】:

    • 谢谢 Hardbyte。一定是我读过的最好的答案之一。很好的解释。我真的明白了,我想。非常感谢!
    【解决方案2】:

    先使用简单字典排序,再使用OrderedDict()

    >>> from collections import OrderedDict as od
    >>> k=sorted(t, key=lambda x:len(t[x]), reverse=True)
    >>> k
    ['rk5', 'rand_key_2', 'rand_key_3', 'rand_key_1']
    
    >>> od((x, t[x]) for x in k)
    OrderedDict([('rk5', [1, 100, 3, 4, 3, 3]), ('rand_key_2', [13, 23]), ('rand_key_3', [1]), ('rand_key_1', ['x'])])
    

    【讨论】:

    • 你好阿什维尼。谢谢您的帮助。这不完全是我想要的,但由于它是不可能的(我的心所渴望的),我将使用你的第一个解决方案,像一个键一样使用它来按顺序迭代并从字典中打印。
    【解决方案3】:

    因为有序字典会记住它的插入顺序,所以你可以这样做:

    OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
    

    【讨论】:

    • 我认为您希望 t[1] 按键值的长度排序;这对密钥的长度进行排序。
    【解决方案4】:

    Python 中的OrderedDict 是一个可以记住插入项的顺序的集合。在这种情况下有序并不意味着已排序。

    如果您只需要按排序顺序获取所有项目,您可以执行以下操作:

    for key, value in sorted(t, key = lambda x: -len(x[0])):
      # do something with key and value
    

    但是,您仍在使用未排序的数据结构 - 只是按排序顺序对其进行迭代。这仍然不支持查找第 k 个元素或 dict 中元素的后继或前驱等操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多