1

このコードは文字を数えますが、同じ文字を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回書き換えたくない

4

2 に答える 2

8

使用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
于 2012-11-17T08:37:33.243 に答える
3

次にセットを使用します-これは、その中の一意のアイテムのみを許可します。

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)))
于 2012-11-17T08:38:04.727 に答える