【问题标题】:Changing value of second element in a tuple contained within a list更改列表中包含的元组中第二个元素的值
【发布时间】:2014-04-29 18:06:14
【问题描述】:

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

 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”的错误。感谢您的帮助!

【问题讨论】:

  • 什么是message,你知道元组是不可变的吗?
  • 消息只是一串字母
  • 正如您所知道的,字母不是有效的列表索引。列表索引是整数,以0 开头。如果你想要例如object['a'] 工作,object 可能是最好的字典。如果你想让object['a'][0] += 1 工作,一个列表字典。
  • @user3369239 能否向我们展示您的完整代码?

标签: python list for-loop tuples


【解决方案1】:

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

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 中的单个字符到它们的频率的映射,无需您进行任何工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多