无法隐式将'list'对象转换为str Python
我正在尝试导入字母表,但想把每个字母放到一个数组里,而不是放在一个字符串里。虽然分割字母是可以的,但当我想用它来计算输入单词中的字母数量时,出现了一个错误,提示“TypeError: Can't convert 'list' object to str implicitly”。有没有人知道我该怎么解决这个问题?任何帮助都很感激。代码在下面。
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)中使用了哪些字母。
7 个回答
要把列表 splitalphabet
转换成字符串,这样你就可以用 find()
函数来使用它,你可以用 separator.join(iterable)
这个方法:
"".join(splitalphabet)
在你的代码中使用它:
j = year3wordlist[x].find("".join(splitalphabet))
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)
from Levenshtein import distance
distance("because", "becuase") # => 2
编辑:听起来你应该看看 Levenshtein 编辑距离:
join
是一个属于 str
类的方法,你可以这样使用它:
''.join(splitalphabet)
或者这样:
str.join('', splitalphabet)
我觉得你需要的是连接(join):
>>> "".join(splitalphabet)
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
如果你使用 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
编辑:
因为提问者提到他想要创建一个拼字比赛,我来更具体地回答一下。一个拼写正确的单词和一个相似字符串之间的距离可以用很多种方法来衡量。其中一种最常见的方法叫做 '编辑距离' 或者 '莱文斯坦距离'。这个距离表示将输入字符串改写成“正确”字符串所需的插入、删除或替换的次数。
你可以在 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
最后一行只是一个建议,告诉你如何根据学生的输入和正确答案之间的距离来给出一个分数。