2014-03-03 149 views
3

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

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) 

编辑:对不起,我的解释有点不好,我很匆忙。我想要做的是计算一个单词的每个单独的字母,因为我正在编写拼写蜜蜂程序。例如,如果正确的单词是'因为',并且参与拼写的蜜蜂的用户输入了'becuase',我希望程序计算正确单词和用户输入的字符的字符和位置字和比较他们给学生一个标记 - 可能通过使用某种点系统。我有的问题是,我不能简单地说它是对还是错,如果这个词接近正确,我必须授予1分,这正是我想要做的。我在上面的代码中试图做的是拆分字母表,然后使用它来尝试查找输入词(年份3词汇表中的词)与正确词(year3wordlist)中使用的字符。

+0

您是否试图在输入单词中创建字母频率的直方图,或者只是试图计算输入单词中字母的数量? – pat

回答

1

我想你需要的是加入:

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

要将列表splitalphabet转换为字符串,这样你就可以用find()功能使用它,你可以使用separator.join(iterable)

"".join(splitalphabet) 

使用它代码如下:

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

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

''.join(splitalphabet) 

str.join('', splitalphabet) 
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评论,他正试图创建一个拼字大赛,让我试着更具体地回答。正确拼写的单词和类似的字符串之间的距离可以用许多不同的方式来衡量。最常用的方法之一叫做'edit distance'或'Levenshtein distance'。这表示将输入字符串重写为“正确”的字符串所需的插入,删除或替换次数。

您可以在Python-Levenshtein包中找到实现的距离。您可以通过画中画安装:

$ 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 

最后一行就是你如何能够从学生的输入端之间的距离得出一个档次的建议和正确答案。

+0

这就是我想要的种类 - 但是我想要做的是计算一个单词的每个单独的字母,因为我正在编写一个拼写蜜蜂程序。例如,如果正确的单词是'因为',并且参与拼写蜜蜂的用户输入'becuase',我希望程序计算正确单词的字符和用户的输入并比较它们以给出学生一个标记。我有的问题是,我不能简单地说它是对还是错,如果这个词接近正确,我必须授予1分,这正是我想要做的。 – user3112327

+0

嗨!根据您的具体需求编辑我的答案。可能你应该直接询问拼写比赛。你知道,你仍然可以编辑你的问题给他人一个完整的上下文。 :) – logc

+0

@logc +1使用'Levenshtein距离' –

0

虽然连接从分割创建字符串,但您不必这样做,因为您可以在原始字符串(字母)上发出查找。但是,我不认为你正在努力做什么。请注意,您正在尝试查找的查找尝试在year3wordlist [x]内找到splitalphabet(实际上是字母表),它将始终失败(-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(单词)给出了每个单词中的字符数,而len(set(单词))给出了唯一字符的数量。另一方面,你是否说过你的单词可能包含非ascii字符,并且你想要计算该单词中的ascii字符数?我认为你需要在你想确定的内容上更具体。

如果你正在做的是试图确定这些字符是否都是字母,那么你所要做的就是在这个单词上使用isalpha()方法。你可以说word.isalpha()并得到真或假或检查每个字的单词是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 edit distance

from Levenshtein import distance 

distance("because", "becuase") # => 2 
相关问题