2012-02-26 105 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)]