2012-07-31 94 views
2

我在Python中使用Counter類來計算大型python字典中的鍵的字數。我正在創建一個新的字典,其中的鍵是遞增的數字,值是計數器函數的返回值。這是我的新字典的樣子:從字典中刪除'Counter'python

TP = {1:Counter({u'x':1, u'b':1, u'H':3}),2:Counter({u'j':1, u'm':4, u'e':2})...} 

我想要做什麼,如果可能的話,是去除Counter和括號(和)讓我的字典裏是這樣的:

TP = {1:{u'x':1, u'b':1, u'H':3}, 2:{u'j':1, u'm':4, u'e':2}...} 

如果這是不可能的,有人可以告訴我如何訪問()中的嵌套字典?謝謝

回答

5

我沒有看到這樣做的任何一點,Counterdict的子類,並支持它的所有方法,所以你應該沒有問題離開它,雖然只是爲了這個問題,我會將其轉換回正常dict

>>> from collections import Counter 
>>> tp = {1:Counter({u'x':1, u'b':1, u'H':3}),2:Counter({u'j':1, u'm':4, u'e':2})} 
>>> dict((k, dict(v)) for k, v in tp.iteritems()) 
{1: {u'x': 1, u'b': 1, u'H': 3}, 2: {u'e': 2, u'j': 1, u'm': 4}} 

對於Python 2.7+(由@Blender所建議的)

{k: dict(v) for k, v in tp.iteritems()} 

迭代通過分字典例如:

for w, c in tp[1].iteritems(): 
    print w, c 
+1

或者用字典理解:'{k:dict(v)for k,v in tp.iteritems()}' – Blender 2012-07-31 00:44:38

+0

@Blender我保持交叉兼容,但我也將其作爲選項加入:) – jamylak 2012-07-31 00:45:26

+0

重點是我不希望每個人都將單詞作爲關鍵字,這是計數器函數的標準返回。但感謝解決方案!另外,我會很高興讓它保持原樣,但是如何訪問括號內的鍵和計數值? – adohertyd 2012-07-31 00:45:34

0

您可能正在尋找一種漂亮的打印方法。

這是一種方法,包括:

tp = {1:Counter({u'x':1, u'b':1, u'H':3}),2:Counter({u'j':1, u'm':4, u'e':2})} 
pprint_counter(tp) 

打印:

1: x:1 b:1 H:3 
    2: m:4 j:1 e:2 

現在訪問子元素的 'x':

def pprint_counter(c): 
    for k, v in c.items(): 
     l=[u'{}:{}'.format(ks,vs) for ks,vs in v.items()] 
     print '{:4}: {}'.format(k, ' '.join(l)) 

現在用您的示例測試

tp[1]['x']=123 
pprint_counter(tp) 

打印:

1: x:123 b:1 H:3 
    2: m:4 j:1 e:2 

所以,你可以用腳標訪問各個元素直接`TP [1] [ 'X'],你的願望格式化 - 只需添加代碼。