2016-03-01 2 views
-2

Помощь с кодом ниже с использованием многомерного списка Мне нужно найти каждую строку для символов в массиве и найти слово и вернуть местоположение 1-й буквы. Это отлично работает для одной буквы, но когда я пробую слово, которое начинается с буквы в массиве, но не целое слово, это не работает. Может кто-то мне помочь здесь. Я вижу, что я начинаю с x = word [0], но всякий раз, когда я пытаюсь увеличить значение для x, я должен продолжать испортить. В принципе мне нужно «aca», чтобы вернуть [2, 1], поскольку это начало 1-го символа в слове, но я вводил ara. NONE должен быть возвращаемым значением.многомерный список поиск

def find_word_horizontal(crosswords,word): 

    word=str(word) 
    x=word[0] 
    char=0 
    crosslen=len(crosswords) 
    found=False 

    for row in crosswords: 
     r=crosswords.index(row) 
     wordcount=len(word) 
     for i in range(0, len(row)): 
      if wordcount<2: 
       if row[i]==x: 
        r=crosswords.index(row) 
        found=True 
        print([r, i]) 
        return([r, i]) 
      else: 
       for i in range(0, len(row)): 
        for let in word: 
         if row[i]==let and char<=wordcount: 
          char+=1 
         if char==wordcount: 
          t=0 
          for c in row: 
           if c==x: 
            found=True 
            r=crosswords.index(row) 
            print([r, t]) 
            return([r, t]) 
           t+=1 
          char=0 
         else: 
          continue 
    if found==False: 
     print(None) 
     return None 

crosswords=[['s', 'd', 'o', 'g'], ['c', 'u', 'c', 'm'], ['a', 'c', 'a', 't'], ['t', 'e', 't', 'k']] 
word='aca' 
find_word_horizontal(crosswords,word) 
+2

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) применим здесь. Мы не можем эффективно помочь вам, пока вы не разместите свой код * и * точно не опишите проблему. «Это не работает» и «Я продолжаю испортить» - это не описание проблем. Однобуквенные имена переменных и отсутствие описательных комментариев оставляют ваш код в качестве игры для угадывания другим. – Prune

+0

Кроме того, почему вы ожидаете [2,1], когда слово начинается с [2,0]? Позиция [2,1] - это «c». Ваш код уже производит [2,0] для чего-либо, начиная с «a» - это начало. – Prune

+1

Вы также можете забрать несколько советов из [Как отладить] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). – Prune

ответ

1

Я отсканировал вашу программу, и я думаю, что я нашел концептуальную проблему.

Похоже, что вы неправильно обрабатывать нашли: вы установите его (в Истинного), как только вы найдете один символ, который соответствует. Если более поздние буквы не совпадают, у вас нет возможности очистить найдено (до False).

Прежде всего, я предлагаю вам взглянуть на проблему более подробно: сначала найдите все слово. Регистрация буквы строки в строку, а затем использовать найти метод:

whole_row = ''.join(row) 
found_at = whole_row.find(word) 
if found_at >= 0: 
    return([r, found_at]) 

Это может заменить большую часть вашей центральной логики. Если вы хотите короткое сокращение Pythonic, вы можете комбинировать первые две строки выше - или одну, если хотите вытащить трюк с оптимизацией или дублировать вызов. Я пока не рекомендую.


Используйте имена описательных переменных. Что-то с одной буквой не должно иметь индивидуальности и использоваться только для жесткой петли. Не ошибайтесь: char должен быть единственным символом, но вы сделали его целым числом.

Вы испортили значение счетчика цикла: в то время как я все еще активен в для цикла в строке 11, вы затем использовать его в качестве счетчика цикла в строке 19. Это разрушает его первоначальное использование ,

Почему вы оба печатаете и возвращаете результат?

Почему вы устанавливаете r в число строк ... несколько раз? Если вам нужен номер строки, а затем просто запустить свой внешний контур таким образом:

for row_num in range(len(crosswords)): 
    row = crosswords[row_num] 

... и это последнее, что вам нужно манипулировать либо из них. Вы, похоже, сделали аналогичную вещь с c и t в вашей самой внутренней петле.

Надеюсь, этого достаточно, чтобы заставить вас двигаться вперед и помочь вам немного затянуть свое программирование.

+0

Спасибо, помощник за помощь. Я определенно собираюсь попробовать и переработать, используя пункты, выше которых вы помогаете, очень ценится. – kbbkirl

+0

Когда вы столкнетесь с этой проблемой, не забудьте «принять» ответ: SO получает, чтобы уйти в отставку; вы получаете очки, как и тот, кто написал ответ. Помните, что также можно написать сводный ответ, чтобы объединить всю помощь и принять ваше собственное представление. Наверху голосовали люди, которые помогали - это хорошая практика. – Prune

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