2012-02-26 104 views
2

我需要排序和搜索字典。我知道字典不能排序。但是,我需要通过它以有序的格式进行搜索。字典本身不需要排序。在Python中搜索和排序字典

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

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

关于一个侧面说明有人可以告诉我如何在python中以良好的格式打印?像:

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

insdead单行。感谢您的时间。

+1

您可以使用[pprint](http://docs.python.org/library/pprint.html)在多行中漂亮地打印字典。 – 2012-02-26 19:15:54

回答

3

如果要排序基于整数值,你可以做以下的字典。

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名,然后通过按键搜索,与您选择的搜索模式。

1

由于你已经使用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'} 
1

格式不错请查看pprint module

如果我理解正确,OrderedDict不是你想要的。 OrderedDict记住添加密钥的顺序;他们不跟踪价值。你可以得到你想要的使用发电机来转换初始数据:

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] 
1

,你可以进行排序,虽然他们的dicionary的键:

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

for key in sorted(dict.keys()): 
    print dict[key] 

这将基于键的排序输出(以你的情况下,字符串值的字母顺序)

1

有几个不同的工具,可以帮助你:

  • ŧ他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),这将返回一个迭代器。
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)] 

排序的价值,而不是你需要重写排序的主要功能的关键。

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)]