无法隐式地将'list'对象转换为字符串 Python。

3
我试图导入字母表,但要将每个字符拆分到一个数组中而不是一个字符串。虽然可以分割它,但当我尝试使用它来查找输入单词中有多少个字符时,我会收到错误“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)使用了哪些字符。


你是想要创建一个输入单词中字母频率的直方图,还是只是想要计算输入单词中字母的数量? - pat
7个回答

2
如果您使用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

编辑:

鉴于原帖作者表示正在尝试创建一个拼写比赛,让我来更具体地回答一下。正确拼写的单词与类似字符串之间的距离可以用许多不同的方式进行衡量。其中最常见的方法之一称为“编辑距离”或“Levenshtein 距离”。这代表了将输入字符串重写为“正确”的字符串所需的插入、删除或替换次数。

您可以在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分,这就是我正在尝试做的事情。 - user3112327
嗨!根据您的具体需求,我编辑了我的答案。也许您应该直接询问拼写比赛。您仍然可以编辑您的问题,以便让其他人了解完整的上下文,您知道的。 :) - logc
@logc +1,因为使用了“Levenshtein距离”。 - Ahmed M. Altahawi

1
"

joinstr类的一个类方法,你可以这样做:

"
''.join(splitalphabet)

or

str.join('', splitalphabet)

1
我认为你需要的是join函数:
>>> "".join(splitalphabet)
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

0

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

"".join(splitalphabet)

在你的代码中使用它:

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

0

虽然join函数可以从split函数创建字符串,但您不必这样做,因为您可以在原始字符串(字母表)上发出查找命令。但是,我认为这不是您想要做的。请注意,您尝试查找splitalphabet(实际上是alphabet)在year3wordlist[x]中的位置,这将始终失败(结果为-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()


0

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

要计算单词中出现在 splitalphabet 中的字符数,可以使用函数式方法:

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

0
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编辑距离

from Levenshtein import distance

distance("because", "becuase")   # => 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接