【问题标题】:Can't convert 'list'object to str implicitly Python无法将'list'object隐式转换为str Python
【发布时间】:2014-04-04 19:38:32
【问题描述】:

我正在尝试导入字母表但将其拆分,以便每个字符都在一个数组中而不是一个字符串中。拆分它有效,但是当我尝试使用它来查找输入单词中有多少个字符时,我收到错误“TypeError:无法将'list'对象隐式转换为str”。有谁知道我将如何解决这个问题?任何帮助表示赞赏。代码如下。

import string
alphabet = string.ascii_letters
print (alphabet)
splitalphabet = list(alphabet)
print (splitalphabet)

x = 1
j = year3wordlist[x].find(splitalphabet)
k = year3studentwordlist[x].find(splitalphabet)
print (j)

编辑:对不起,我的解释有点糟糕,我很着急。我想做的是计算一个单词的每个字母,因为我正在编写一个拼写蜜蜂程序。例如,如果正确的单词是'because',并且参与拼字比赛的用户输入了'becuase',我希望程序计算正确单词的字符和字符位置以及用户输入单词并比较它们以给学生打分 - 可能通过使用某种计分系统。我的问题是我不能简单地说它是对还是错,如果这个词接近正确,我必须给 1 分,这就是我正在尝试做的。我在上面的代码中尝试做的是拆分字母表,然后使用它来尝试查找输入的单词(year3studentwordlist 中的那个)和正确的单词(year3wordlist)中使用了哪些字符。

【问题讨论】:

  • 您是想创建输入单词中字母频率的直方图,还是只是想计算输入单词中的字母数量?

标签: python string typeerror alphabet


【解决方案1】:

如果您使用in 关键字,则有一个更简单的解决方案。您甚至不需要拆分字母表来检查给定的字符是否在其中:

year3wordlist = ['asdf123', 'dsfgsdfg435']
total_sum = 0
for word in year3wordlist:
    word_sum = 0
    for char in word:
        if char in string.ascii_letters:
            word_sum += 1
    total_sum += word_sum

# Length of characters in the ascii letters alphabet:
# total_sum == 12
# Length of all characters in all words:
# sum([len(w) for w in year3wordlist]) == 18

编辑:

由于OP cmets他正在尝试创建拼写比赛,让我尝试更具体地回答。一个正确拼写的单词和一个相似的字符串之间的距离可以用许多不同的方式来测量。最常见的方法之一称为“edit distance”或“Levenshtein distance”。这表示将输入字符串重写为“正确”字符串所需的插入、删除或替换的数量。

您可以在Python-Levenshtein 包中找到该距离。你可以通过 pip 安装它:

$ sudo pip install python-Levenshtein

然后像这样使用它:

from __future__ import division
import Levenshtein

correct = 'because'
student = 'becuase'
distance = Levenshtein.distance(correct, student)  # distance == 2

mark = ( 1 - distance / len(correct)) * 10  # mark == 7.14

最后一行只是关于如何根据学生输入与正确答案之间的距离得出成绩的建议。

【讨论】:

  • 这就是我想要的——但是我想做的是计算一个单词的每个字母,因为我正在编写一个拼写程序。例如,如果正确的单词是'because',而参加拼字比赛的用户输入了'becuase',我希望程序计算正确单词的字符和用户输入的字符并比较它们给出学生一个标记。我的问题是我不能简单地说它是对还是错,如果这个词接近正确,我必须给 1 分,这就是我正在努力做的。
  • 嗨!我根据您的具体需求编辑了我的答案。可能您应该直接询问拼写比赛。您仍然可以编辑您的问题以向其他人提供完整的上下文,您知道的。 :)
  • @logc +1 使用“Levenshtein 距离”
【解决方案2】:

虽然 join 从拆分创建字符串,但您不必这样做,因为您可以在原始字符串(字母表)上发出查找。但是,我不认为这是你想要做的。请注意,您尝试在 year3wordlist[x] 中查找 splitalphabet(实际上是字母表)的 find 总是会失败(-1 结果)

如果您要做的是获取字母表中单词列表的所有字母的索引,那么您需要将其处理为

对于单词列表的单词中的每个字母,确定字母表中的索引。

j = []
for c in word:
  j.append(alphabet.find(c))

print j

另一方面,如果您尝试查找单词中字母表中每个字符的索引,则需要遍历 splitalphabet 以获取单词中的单个字符。那是

l = []
for c within splitalphabet:
  j = word.find(c)
  if j != -1:
    l.append((c, j))
print l

这给出了显示找到的字符和索引的元组列表。

我刚刚看到你在谈论计算字母的数量。我不确定您的意思是什么,因为 len(word) 给出了每个单词中的字符数,而 len(set(word)) 给出了唯一字符的数量。另一方面,您是说您的单词中可能包含非 ascii 字符,并且您想计算该单词中的 ascii 字符数吗?我认为您需要更具体地确定要确定的内容。

如果您正在尝试确定字符是否都是字母,那么您需要做的就是对单词使用 isalpha() 方法。您可以说 word.isalpha() 并得到 True 或 False 或检查 word 的每个字符是否为 isalpha()

【讨论】:

    【解决方案3】:
    import string
    
    # making letters a set makes "ch in letters" very fast
    letters = set(string.ascii_letters)
    
    def letters_in_word(word):
        return sum(ch in letters for ch in word)
    

    编辑:听起来你应该看看Levenshtein edit distance

    from Levenshtein import distance
    
    distance("because", "becuase")   # => 2
    

    【讨论】:

      【解决方案4】:

      我不知道为什么一半的答案都在告诉你如何将拆分的字母重新组合在一起......

      要计算出现在splitalphabet 中的单词中的字符数,请按功能方式进行:

      count = len([c for c in word if c in splitalphabet])
      

      【讨论】:

        【解决方案5】:

        joinstr的类方法,可以这样做

        ''.join(splitalphabet)
        

        str.join('', splitalphabet)
        

        【讨论】:

          【解决方案6】:

          要将列表splitalphabet 转换为字符串,以便将其与find() 函数一起使用,您可以使用separator.join(iterable)

          "".join(splitalphabet)
          

          在您的代码中使用它:

          j = year3wordlist[x].find("".join(splitalphabet))
          

          【讨论】:

            【解决方案7】:

            我认为你需要的是加入:

            >>> "".join(splitalphabet)
            'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
            

            【讨论】:

              猜你喜欢
              • 2018-12-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-02-24
              • 2017-12-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多