這段代碼計算字母,但我不希望它重寫兩次相同的字母。我能做什麼?我如何計算,而不是在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' 兩次
這段代碼計算字母,但我不希望它重寫兩次相同的字母。我能做什麼?我如何計算,而不是在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' 兩次
使用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
,或者您也可以使用來自itertools Recipes
的unique_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
你爲什麼要聲明'd'作爲列表? –
@NiklasR刪除了那個,只是複製了問題主體。 –
使用裝置然後 - 這允許它只有唯一項目:
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)))
注意,你不需要做'banttnay'列表,以便能夠在它迭代(循環)。 –
@MartijnPieters,但只有列表有獲得字符數所需的'count'方法。 – phineas
@phineas:''abcc'.count('c')' - >'2'。不,弦也有。 –