2016-11-01 2 views
1

Примечание: Я не могу использовать любой другой импорт, чем SYS и гипергликемию на этот вопросPython - проверка, все ли слова в строке в массиве

Для присвоения я должен взять в двух файлах, как система аргументы и оба файла содержат строки строк.

Получите мое задание, я хочу прочитать одну строку за раз в одном файле и проверить, имеются ли все слова в этой строке в другом файле.

Вот файлы:

g1.ecfg

S -> NP VP 
NP -> Det N 
NP -> PN 
Det -> "the" 
N -> "dog" 
N -> "rat" 
N -> "elephant" 
PN -> "Alice" 
PN -> "Bob" 
VP -> V NP 
V -> "admired" 
V -> "bit" 
V -> "chased" 

u1a.utt

the aardvark bit the dog 
the dog bit the man 
Bob killed Alice 

Итак, я хочу, чтобы прочитать каждую строку в U1A. utt и убедитесь, что каждое слово в этой строке находится в g1.ecfg.

Я понял, что кавычки в g1 может быть проблемой, так что я положил все слова, которые в кавычках в массиве без кавычек, оставленных в.

Мой текущий код всегда возвращает ложь, которая производит «Нет действительный синтаксический анализ ", даже если строка должна печатать" Parsing !!! "

Может кто-нибудь помочь мне понять, как сравнивать слова в каждой строке с файлом g1?

Вот мой код:

import sys 
import io 

# usage = python CKYdet.py g#.ecfg u#L.utt 

# Command Line Arguments - argv[0], argv[1], argv[2] 
script = sys.argv[0] 
grammarFile = open(sys.argv[1]) 
utteranceFile = open(sys.argv[2]) 

# Initialize rules from grammarFile 

ruleArray = [] 
wordsInQuotes = [] 
uttWords = [] 

for line in grammarFile: 
    rule = line.rstrip('\n') 
    start = line.find('"') + 1 
    end = line.find('"', start) 
    ruleArray.append(rule) 
    wordsInQuotes.append(line[start:end]) #create a set of words from grammar file 


for line in utteranceFile: 
    x = line.split() 
    print x 
    if (all(x in grammarFile for x in line)): #if all words found in grammarFile 
     print "Parsing!!!" 
    else: 
     print "No valid parse" 

Я думаю, что это может иметь что-то с моими списки быть hashable или нет, или, может быть вопрос объема, но я изо всех сил, чтобы найти альтернативу, которая работает для меня.

+3

'все (x в грамматикеFile для x в строке)'. Вы проверяете, находится ли каждый символ в строке '' grammarFile''. Это не похоже на то, что вы пытаетесь сделать. Вероятно, что-то больше похоже на 'x в словахInQuotes для x в line.split()'. –

+0

Это сработало! Огромное спасибо. Это была всего лишь небольшая логическая ошибка, но я потратил много времени на то, чтобы понять, что происходит. –

ответ

0

Давайте воспользуемся наборами для хранения предметов, которые мы позже проверим для участия, и используйте str.split, чтобы найти слова в кавычках.

with open('grammarfile') as f: 
    words = set() 
    for line in f: 
     line = [a for a in line.split() if '"' in a] 
     for a in line: 
      words.add(a.replace('"', '')) 

with open('utterancefile') as f: 
    for line in f: 
     if all(a in words for a in line.split()) 
      print("Good Parse") 
     else: 
      print("Word not found") 
+0

Спасибо. Я использовал вышеприведенный ответ, но ваш тоже работает, поэтому я отметил это правильно. –

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