给定一个字符串s
,我想知道字符串上每个字符出现的次数。这是代码:
def main() :
while True :
try :
line=raw_input('Enter a string: ')
except EOFError :
break;
mp={};
for i in range(len(line)) :
if line[i] in mp :
mp[line[i]] += 1;
else :
mp[line[i]] = 1;
for i in range(len(line)) :
print line[i],': ',mp[line[i]];
if __name__ == '__main__' :
main();
当我运行此代码并输入abbba
时,我得到:
a : 2
b : 3
b : 3
b : 3
a : 2
我只想得到:
a : 2
b : 3
我理解为什么会发生这种情况,但由于我是python的新手,我不知道任何其他方法来迭代地图的元素。谁能告诉我怎么做?提前致谢。
答案 0 :(得分:12)
您可以尝试使用Counter(Python 2.7及以上版本;请参阅下面的2.7之前的选项):
>>> from collections import Counter
>>> Counter('abbba')
Counter({'b': 3, 'a': 2})
然后,您可以像字典一样访问元素:
>>> counts = Counter('abbba')
>>> counts['a']
2
>>> counts['b']
3
要迭代,您可以使用@ BurhanKhalid的建议(Counter
表现为字典,您可以在其中迭代键/值对):
>>> for k, v in Counter('abbba').iteritems():
... print k, v
...
a 2
b 3
如果您使用的是2.7之前版本的Python,您可以使用defaultdict
来简化您的代码(过程仍然相同 - 唯一的区别是现在您不必检查首先是密钥 - 如果找不到匹配的密钥,它将'默认'为0)。 Counter
内置了其他功能,但如果您只是想要计数(并且不关心most_common
,或者能够subtract
,那么这应该没问题,可以像任何其他字典一样对待:
>>> from collections import defaultdict
>>> counts = defaultdict(int)
>>> for c in 'abbba':
... counts[c] += 1
...
>>> counts
defaultdict(<type 'int'>, {'a': 2, 'b': 3})
在字典上使用iteritems()
(或此处为Counter
/ defaultdict
)时,会为每次迭代返回一个键和一个值(在这种情况下,键是字母和值是出现的次数)。关于使用字典的一点要注意的是它们本身就是无序的,所以在迭代时你不一定会得到'a', 'b', ...
。以排序方式迭代字典的一种基本方法是遍历排序的键列表(这里按字母顺序排列,但sorted
可以操作以处理各种选项),并返回字典值那个关键(还有其他方法,但希望有点提供信息):
>>> mapping = {'some': 2, 'example': 3, 'words': 5}
>>> mapping
{'some': 2, 'example': 3, 'words': 5}
>>> for key in sorted(mapping.keys()):
... print key, mapping[key]
...
example 3
some 2
words 5
答案 1 :(得分:7)
迭代mapping会产生密钥。
>>> d = {'foo': 42, 'bar': 'quux'}
>>> for k in d:
... print k, d[k]
...
foo 42
bar quux
答案 2 :(得分:2)
您需要查找dict()的帮助。它就在那里 - 对于k in mp&#39;迭代键,对于mp.values()&#39;迭代值,&#39;对于k,v在mp.items()&#39;迭代键值对。
另外,你不需要那些分号。虽然它们在Python中是合法的,但没有人使用它们,因此几乎没有理由。
答案 3 :(得分:1)
Python 2.5及以上
dDIct = collections.defaultdict(int)
[(d[i]+=1) for i in line]
print dDict