このコードは文字を数えますが、同じ文字を2回書き直したくありません。私に何ができる?
d=list('banttnay')
for letter in d:
print letter, d.count(letter)
出力:
b 1
a 2
n 2
t 2
t 2
n 2
a 2
y 1
「a2」または「t2」を2回書き換えたくない
使用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
またはモジュールOrderedDict
からの注文使用を維持するには:collections
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
または、 :unique_everseen
からのレシピを使用することもできます。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
次にセットを使用します-これは、その中の一意のアイテムのみを許可します。
d = 'banttnay'
for letter in set(d):
print letter, d.count(letter)
または、collections.Counterを使用して、反復可能な一意のアイテムの量を計算します。
from collections import Counter
cnt = Counter('banttnay')
print cnt
そして、このような何か:
word = 'banttnay'
res = dict(zip(set(word),map(word.count, word)))