2013-07-09 4 views
0

Так что я работаю над программой для создания portmanteaus. У меня есть код и функции, которые мне нужны, и я собрал их вместе.Python таинственная ошибка

Вот код:

def portmanteauscore(start, mid, end): 
    totallen = len(start) + len(mid) + len(end) 
    return totallen - abs((len(start)/totallen) - len(start)) - abs((len(mid)/totallen) - len(mid)) - abs((len(end)/totallen) - len(end)) 


def portmanteaugenerator(word1, word2, words): 
    mid = longest_common_substring(word1, word2) 
    start = word1[:word1.index(mid)] 
    end = word2[len(mid):] 
    if start + mid in words and mid + end in words: 
     return start, mid, end 


def natalie(words): 
    "Find the best Portmanteau word formed from any two of the list of words." 
    wordpermutations = list(itertools.permutations(words)) 
    maxscore, bestnatalie = 0, '' 
    for perm in wordpermutations: 
     start, mid, end = portmanteaugenerator(perm[0], perm[1], words) 
     if portmanteauscore(start, mid, end) > maxscore: 
      bestnatalie, maxscore = start + mid + end, portmanteauscore(start, mid, end) 
    print bestnatalie 
    return bestnatalie 


def longest_common_substring(s1, s2): 
    m = [[0] * (1 + len(s2)) for i in xrange(1 + len(s1))] 
    longest, x_longest = 0, 0 
    for x in xrange(1, 1 + len(s1)): 
     for y in xrange(1, 1 + len(s2)): 
      if s1[x - 1] == s2[y - 1]: 
       m[x][y] = m[x - 1][y - 1] + 1 
       if m[x][y] > longest: 
        longest = m[x][y] 
        x_longest = x 
      else: 
       m[x][y] = 0 
    return s1[x_longest - longest: x_longest] 

Но когда я запускаю код, я получаю сообщение об ошибке,

Traceback (most recent call last): 
File "vm_main.py", line 33, in <module> 
    import main 
    File "/tmp/vmuser_ijxrjleuxj/main.py", line 107, in <module> 
    print test_natalie() 
    File "/tmp/vmuser_ijxrjleuxj/main.py", line 87, in test_natalie 
assert natalie(['adolescent', 'scented', 'centennial', 'always', 'ado']) in  ('adolescented','adolescentennial') 
    File "/tmp/vmuser_ijxrjleuxj/main.py", line 67, in natalie 
    start,mid,end=portmanteaugenerator(perm[0],perm[1],words) 
TypeError: 'NoneType' object is not iterable 

Это происходит, когда я вернусь в начале, середине и конечные переменные для генератора portmanteau. Когда задан список слов, он должен возвращать портманте из двух слов, которые лучше всего соответствуют оценке портмана.

Но по какой-то причине я по-прежнему получаю ошибку этого типа. Я попытался сделать стартовый, средний, конец списка, и он все еще не работает. Не могли бы вы мне помочь?

+2

Больше мест! Пространства после запятых и вокруг двоичных операторов сделали бы это намного более удобочитаемым. – user2357112

+0

Ирония при разговоре о portmanteaгенераторе;) – icedwater

ответ

6

Скорее всего, start+mid in words and mid+end in words возвращает False и поэтому функции, а не проходить через if-statement, возвращает None (потому что если функция не возвращает что-то, то по умолчанию None).

Тогда вы пытаетесь сделать что-то вроде:

start,mid,end = None 

Что питон пытается сделать, это разделить None в этих трех переменных. Это как это сделать:

one, two, three = (1, 2, 3) 

Но вы не можете, потому что None не итератор.

Смежные вопросы