更改列表中包含的元组中第二个元素的值

0 python for-loop tuples list

我无法更改列表元组中某个元素的值.

 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
Run Code Online (Sandbox Code Playgroud)

当我使用这个时,我得到的错误是"列表索引必须是整数,而不是str".谢谢您的帮助!

Mar*_*ers 5

元组是不可改变的; 你将不得不重建整个元组.但是,您没有映射,每次都必须搜索整个字母列表:

for m in message:
    letterList = [(l, c + 1 if m == c else c) for l, c in letterList]
Run Code Online (Sandbox Code Playgroud)

这是非常低效的; 否则你找不到匹配的元组.你会更好地使用实际的字典.

这就是你的循环中的代码(有点)试图做的事情; 治疗letterList作为一本字典; 将单个字符映射到计数.但是列表只将整数作为索引; 0是第一个值,1是第二个,依此类推; m但是,这是一个单字符串,这不是一个可接受的索引.

您可以轻松将您转换letterList为字典:

letterDict = dict(letterList)
Run Code Online (Sandbox Code Playgroud)

然后递增值:

for m in message:
    letterDict[m] += 1
Run Code Online (Sandbox Code Playgroud)

请注意,这里没有第二个索引.

但是,在这种情况下,你真的想在collections.Counter()这里使用一个对象:

from collections import Counter

counts = Counter(message)
Run Code Online (Sandbox Code Playgroud)

现在counts包含从各个角色message到其频率的映射,无需您做任何工作.