Reputation: 173
This code count the letters but i don't want it to rewrite the same letter twice. What can i do?
d=list('banttnay')
for letter in d:
print letter, d.count(letter)
Output:
b 1
a 2
n 2
t 2
t 2
n 2
a 2
y 1
I don't want it to rewrite 'a 2' or 't 2' twice
Upvotes: 1
Views: 2207
Reputation: 250961
use set()
:
In [40]: d='banttnay'
In [41]: for x in set(d):
....: print x,d.count(x)
....:
a 2
y 1
b 1
t 2
n 2
or to maintain the order use OrderedDict
from collections
module:
In [67]: from collections import *
In [68]: c=OrderedDict()
In [69]: for x in d:
c[x]=c.get(x,0)+1
In [71]: for x in c:
....: print x,c[x]
....:
b 1
a 2
n 2
t 2
y 1
or you can also use the unique_everseen
recipe from the itertools Recipes
:
>>> d='banttnay'
>>> from itertools import *
>>> def unique_everseen(iterable, key=None):
... seen = set()
... seen_add = seen.add
... if key is None:
... for element in ifilterfalse(seen.__contains__, iterable):
... seen_add(element)
... yield element
... else:
... for element in iterable:
... k = key(element)
... if k not in seen:
... seen_add(k)
... yield element
...
>>> for x in unique_everseen(d):
... print x,d.count(x)
...
b 1
a 2
n 2
t 2
y 1
Upvotes: 8
Reputation: 29113
Use sets then - which allows only unique items in it:
d = 'banttnay'
for letter in set(d):
print letter, d.count(letter)
Or use collections.Counter to calculate amount of unique items in iterable:
from collections import Counter
cnt = Counter('banttnay')
print cnt
And somethig like this:
word = 'banttnay'
res = dict(zip(set(word),map(word.count, word)))
Upvotes: 3