2012-11-17 29 views
1

這段代碼計算字母,但我不希望它重寫兩次相同的字母。我能做什麼?我如何計算,而不是在Python中重複相同的字母

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 

我不希望它改寫 '2' 或 'T 2' 兩次

+2

注意,你不需要做'banttnay'列表,以便能夠在它迭代(循環)。 –

+0

@MartijnPieters,但只有列表有獲得字符數所需的'count'方法。 – phineas

+0

@phineas:''abcc'.count('c')' - >'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 

或保持訂單使用OrderedDictcollections模塊:

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 

,或者您也可以使用來自itertools Recipesunique_everseen配方:

>>> 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 
+0

你爲什麼要聲明'd'作爲列表? –

+0

@NiklasR刪除了那個,只是複製了問題主體。 –

3

使用裝置然後 - 這允許它只有唯一項目:

d = 'banttnay' 
for letter in set(d): 
    print letter, d.count(letter) 

或者使用collections.Counter計算量可迭代的獨特項目:

from collections import Counter 
    cnt = Counter('banttnay') 
    print cnt 

而且somethig這樣的:

word = 'banttnay' 
res = dict(zip(set(word),map(word.count, word))) 
相關問題