我无法更改列表元组中某个元素的值。
letterList = [('a', 0), ('b', 0), ('c', 0), ('d', 0), ('e', 0), ('f', 0), ('g', 0), ('h',
0), ('j', 0), ('k', 0), ('l', 0), ('m', 0), ('n', 0), ('o', 0), ('p', 0), ('q', 0), ('r',
0), ('s', 0), ('t', 0), ('u', 0), ('v', 0), ('w', 0), ('x', 0), ('y', 0), ('z', 0)]
for m in message:
letterList[m][0] += 1
当我使用这个时,我得到的错误是“列表索引必须是整数,而不是str”。谢谢你的帮助!
答案 0 :(得分:5)
元组是不可变的;你必须重建整个元组。但是,您没有映射,您每次都必须搜索整个字母列表:
for m in message:
letterList = [(l, c + 1 if m == c else c) for l, c in letterList]
这非常效率低下;否则你找不到匹配的元组。你使用真正的字典要好得多。
你的循环中的代码是什么(有点)试图做的;将letterList
视为字典;将单个字符映射到计数。但是列表只将整数作为索引; 0
是第一个值,1
是第二个,依此类推; m
是一个单字符字符串,但这不是一个可接受的索引。
您可以轻松地将letterList
转换为字典:
letterDict = dict(letterList)
然后递增值:
for m in message:
letterDict[m] += 1
请注意,这里没有第二个索引。
但是,在这种情况下,您确实想在此使用collections.Counter()
对象:
from collections import Counter
counts = Counter(message)
现在counts
包含从message
中的各个字符到其频率的映射,您无需做任何工作。