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 分,这就是我正在尝试做的。

4

7 回答 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

编辑:

由于OP评论他正在尝试创建拼写比赛,让我尝试更具体地回答。一个正确拼写的单词和一个相似的字符串之间的距离可以用许多不同的方式来衡量。最常见的方法之一称为“编辑距离”或“ 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

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

于 2014-03-03T16:51:19.283 回答
1

join是一个类方法str,你可以做

''.join(splitalphabet)

或者

str.join('', splitalphabet)
于 2014-03-03T16:43:30.547 回答
1

我认为你需要的是加入:

>>> "".join(splitalphabet)
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
于 2014-03-03T16:39:04.090 回答
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)

Edit: it sounds like you should look at Levenshtein edit distance:

from Levenshtein import distance

distance("because", "becuase")   # => 2
于 2014-03-03T17:41:47.643 回答
0

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

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

count = len([c for c in word if c in splitalphabet])
于 2014-03-03T17:06:05.730 回答
0

虽然 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()

于 2014-03-03T17:02:50.207 回答
0

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

"".join(splitalphabet)

在您的代码中使用它:

j = year3wordlist[x].find("".join(splitalphabet))
于 2014-03-03T16:39:16.783 回答