在Python中搜索字典并对其进行排序

时间:2012-02-26 19:12:45

标签: python dictionary

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

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

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

有人可以告诉我如何在python中以良好的格式打印?喜欢:

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

一行一行。谢谢你的时间。

6 个答案:

答案 0 :(得分: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 :(得分: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)]

答案 2 :(得分: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'}

答案 3 :(得分: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]

答案 4 :(得分:1)

你可以按照他们的钥匙进行排序:

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

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

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

答案 5 :(得分:1)

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

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