【问题标题】:Search and sort through dictionary in Python在 Python 中搜索和排序字典
【发布时间】:2012-02-26 19:12:45
【问题描述】:

我需要对字典进行排序和搜索。我知道字典无法排序。但我只需要以排序格式搜索它。字典本身不需要排序。

有 2 个值。一个字符串,它是一个键并且与该键相关联的是一个整数值。我需要得到一个基于整数的排序表示。我可以用 OrderedDict 得到它。

但我只需要打印前 50 个值,而不是整个字典。我需要使用 RegEx 提取一些密钥。说出所有以“a”开头且长度为 5 的键。

顺便说一句,有人可以告诉我如何在 python 中以良好的格式打印吗?喜欢:

{'secondly': 2, 
'pardon': 6, 
'saves': 1, 
'knelt': 1}

没有一行。感谢您的宝贵时间。

【问题讨论】:

  • 您可以使用pprint 漂亮地打印多行字典。

标签: python dictionary


【解决方案1】:

如果要根据整数值对字典进行排序,可以执行以下操作。

d = {'secondly': 2, 'pardon': 6, 'saves': 1, 'knelt': 1}
a = sorted(d.iteritems(), key=lambda x:x[1], reverse=True)

a 将包含一个元组列表:

[('pardon', 6), ('secondly', 2), ('saves', 1), ('knelt', 1)]

您可以使用 a[:50] 将其限制在前 50 名,然后使用您的搜索模式搜索键。

【讨论】:

    【解决方案2】:

    有很多方法可以获得排序的字典,sortediteritems()是你的朋友。

    data = {'secondly': 2, 'pardon': 6, 'saves': 1, 'knelt': 1}
    

    我用得最多的模式是:

    key = sorted(data.iteritems())
    print key   #[('knelt', 1), ('pardon', 6), ('saves', 1), ('secondly', 2)]
    
    key_desc = sorted(data.iteritems(), reverse=True)
    print key_desc #[('secondly', 2), ('saves', 1), ('pardon', 6), ('knelt', 1)]
    

    要对值而不是键进行排序,您需要覆盖 sorted 的键函数。

    value = sorted(data.iteritems(), key=lambda x:x[1])
    print value #[('saves', 1), ('knelt', 1), ('secondly', 2), ('pardon', 6)]
    
    value_desc = sorted(data.iteritems(),key=lambda x:x[1], reverse=True)
    print value_desc #[('pardon', 6), ('secondly', 2), ('saves', 1), ('knelt', 1)]
    

    【讨论】:

      【解决方案3】:

      要获得漂亮的格式,请查看pprint module

      如果我理解正确,OrderedDict 并不是您真正想要的。 OrderedDicts 记住添加键的顺序;他们不跟踪价值观。您可以使用生成器来转换初始数据以获得所需的内容:

      import re, operator
      thedict = {'secondly':2, 'pardon':6, ....}
      pat = re.compile('^a....$') # or whatever
      top50 = sorted(((k,v) for (k,v) in thedict.iteritems() if pat.match(k)), reverse=True, key=operator.itemgetter(1))[:50]
      

      【讨论】:

        【解决方案4】:

        由于您已经在使用 OrderedDict,因此您可能可以通过列表理解来做您需要的事情。比如:

        [ value for value in d.values()[:50] if re.match('regex', value) ]
        

        如果您需要更具体的内容,请发布您当前的代码。

        对于多行漂亮打印,如果需要,请使用pprint 和可选的width 参数:

        In [1]: import pprint
        In [2]: d = {'a': 'a', 'b': 'b' }
        In [4]: pprint.pprint(d)
        {'a': 'a', 'b': 'b'}
        In [6]: pprint.pprint(d,width=20)
        {'a': 'a',
         'b': 'b'}
        

        【讨论】:

          【解决方案5】:

          有一些不同的工具可以帮助您:

          • sorted 函数采用可迭代对象并按顺序遍历元素。所以你可以说for key, value in d.iteritems()
          • filter 函数接受一个可迭代对象和一个函数,并且只返回函数计算结果为True 的那些元素。因此,例如,filter(lambda x: your_condition(x), d.iteritems()) 会给您一个键值元组列表,然后您可以按上述方式对其进行排序。 (在 Python 3 中,filter 返回一个迭代器,这更好。)
          • 生成器表达式可让您将以上所有内容合二为一。例如,如果你只关心值,你可以写(value for key, value in sorted(d.iteritems()) if condition),它会返回一个迭代器。

          【讨论】:

            【解决方案6】:

            您可以对字典的键进行排序:

            dict = {'secondly': 2, 
                    'pardon': 6, 
                    'saves': 1, 
                    'knelt': 1}
            
            for key in sorted(dict.keys()): 
                print dict[key]
            

            这将根据键对您的输出进行排序。(在您的情况下,字符串值按字母顺序排列)

            【讨论】:

              猜你喜欢
              • 2011-09-16
              • 2020-10-18
              • 1970-01-01
              • 2017-10-02
              • 2019-11-28
              • 1970-01-01
              • 2012-02-09
              • 2019-08-02
              相关资源
              最近更新 更多