I am using the Counter
class in Python to count the number of words in a key of a large python dictionary. I am creating a new dictionary with the keys being incremented numbers and the values being the return of the counter function. This is what my new dictionary looks like:
TP = {1:Counter({u'x':1, u'b':1, u'H':3}),2:Counter({u'j':1, u'm':4, u'e':2})...}
What I want to do, if possible, is remove the Counter
and the parentheses ( and ) so that my dictionary looks like:
TP = {1:{u'x':1, u'b':1, u'H':3}, 2:{u'j':1, u'm':4, u'e':2}...}
If that's not possible, can someone please tell me how to access the nested dictionaries inside the ()? Thank you
I don't see any point of doing this, Counter
is a subclass of dict
and supports all of it's methods so you should have no problems leaving it as is, although just for the sake of this question I will convert it back to a normal 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}}
For Python 2.7+ (as suggested by @Blender)
{k: dict(v) for k, v in tp.iteritems()}
Iterating through subdictionaries eg:
for w, c in tp[1].iteritems():
print w, c
You might be looking for a pretty print method.
This is a method:
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))
Now test with your example:
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)
Prints:
1: x:1 b:1 H:3
2: m:4 j:1 e:2
Now access the sub element 'x':
tp[1]['x']=123
pprint_counter(tp)
Prints:
1: x:123 b:1 H:3
2: m:4 j:1 e:2
So the individual elements you access by subscripting directly `tp[1]['x'] and the formating you desire -- just add code.