2014-01-23 5 views
0

У меня возникли проблемы с доступом к некоторым значениям в словаре, который я сделал. В моем коде я прочитал два разных словаря при чтении файла. Код у меня есть это:ключ словаря python не работает

nonterminal_rules = defaultdict(list) 
terminal_rules = defaultdict(list) 

for line in open(file, 'r').readlines(): 
    LHS,RHS = line.strip().split("->") 
    if RHS[1] == "'" and RHS[-1] == "'" : 
     terminal_rules[LHS].append(RHS.strip()) 
    else: 
     nonterminal_rules[LHS].append(RHS.split()) 

for i in nonterminal_rules: 
    for j in nonterminal_rules[i]: 
     if len(j) == 1: 
      x = terminal_rules[j[0]]) 

Вот ключи и значения в моей Dict:

print(self.original_grammar.terminal_rules.items()) 
dict_items([('NN ', ["'body'", "'case'", "'immunity'", "'malaria'", "'mouse'", "'pathogen'", "'research'", "'researcher'", "'response'", "'sepsis'", "'system'", "'type'", "'vaccine'"]), ('NNS ', ["'cells'", "'fragments'", "'humans'", "'infections'", "'mice'", "'Scientists'"]), ('Prep ', ["'In'", "'with'", "'in'", "'of'", "'by'"]), ('IN ', ["'that'"]), ('Adv ', ["'today'", "'online'"]), ('PRP ', ["'this'", "'them'", "'They'"]), ('Det ', ["'a'", "'A'", "'the'", "'The'"]), ('RP ', ["'down'"]), ('AuxZ ', ["'is'", "'was'"]), ('VBN ', ["'alerted'", "'compromised'", "'made'"]), ('Adj ', ["'dendritic'", "'immune'", "'infected'", "'new'", "'Systemic'", "'weak'", "'whole'", "'live'"]), ('VBN ', ["'discovered'"]), ('Aux ', ["'have'"]), ('VBD ', ["'alerted'", "'injected'", "'published'", "'rescued'", "'restored'", "'was'"]), ('COM ', ["','"]), ('PUNC ', ["'?'", "'.'"]), ('PossPro ', ["'their'", "'Their'"]), ('MD ', ["'Will'"]), ('Conj ', ["'and'"]), ('VBP ', ["'alert'", "'capture'", "'display'", "'have'", "'overstimulate'"]), ('VB ', ["'work'"]), ('VBZ ', ["'invades'", "'is'", "'shuts'"]), ('NNP ', ["'Dr'", "'Jose'", "'Villadangos'"])]) 

Допустим, у меня есть пару ключ-значение {Aux: [ "есть"]}. Проблема в том, что если i = Aux, например, x просто устанавливается как пустой список, когда я действительно хочу быть равным ["have"].

Я не уверен, что я делаю/обращаюсь неправильно. Есть идеи? Благодаря!

+0

Было бы, наверное, проще показать результат, как результат self.original_grammar.terminal_rules.items(), и вы можете показать его как для term_rules, так и для non_terminal_rules. Было бы проще смотреть на словарь таким образом, вместо того, чтобы смотреть на ключ/значения по отдельности. – DivineWolfwood

+0

В вашем выводе нет пустых списков, '['', '"] 'не считается пустым списком. –

+0

с ключом: пара значений '{" Aux ": [" have "]}', 'i ==" Aux "', 'nonterminal_rules [i] == [" have "]' и 'terminal_rules [j [ 0]] 'является' KeyError', что означает для 'defaultdict (list)' он создает пустой список и присваивает его 'x'. –

ответ

1

Я исхожу из чтения вашего кода, что вы хотите, чтобы все, что начиналось и заканчивалось словами «, ​​правильно? В этом случае вы, вероятно, хотите

if RHS[0] == "'" and RHS[-1] == "'" : 
    terminal_rules[LHS].append(RHS.strip()) 

Поскольку 0 - первый символ строки :). Если 'не является вторым символом разделительной строки, то теперь он добавит все к non_terminal_rules.

+0

Да, это то, что я бы понял, но когда я использую RHS [0] вместо RHS [1], словарь заканчивается пустым, и я понятия не имею, почему ... – user3229872

0

Если вы пытаетесь установить terminal_rules быть каждый ключ: значение пары в nonterminal_rules, что имеет длину 1, сделайте следующее:

nonterminal_rules = defaultdict(list) 
terminal_rules = defaultdict(list) 

for line in open(file, 'r').readlines(): 
# Do stuff here as you've done above 

terminal_rules = {key:value for key,value in nonterminal_rules.items() if len(value) == 1} 
+0

Не совсем. nonterminal_rules [i] должен составить список списков. Если этот созданный список длиннее всего одного члена, я хочу найти первый индекс этого списка, использовать его как ключ в терминале_rules и затем сохранить значение, связанное с ним. Я могу посмотреть в окне моих переменных и посмотреть, когда у терминала есть указанный ключ, но даже когда я вижу, что он есть, код, похоже, делает второй ключ и возвращает пустой список. – user3229872

+0

Вот пример. Скажем, nonterminal_rules имеет запись {AUX: ['Aux'}}, а в терминале_rules есть запись {Aux: ["is", "was"]}. В конечном итоге я хочу создать новый словарь, который будет похож на {AUX: ["is", "was"]}. Мне нужно сделать это для нескольких записей, через и только тогда, когда пара в nonterminal_rules имеет значение, равное len == 1 (т. Е. Не для таких записей, как {S: [NP, VP]} – user3229872

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

  • Нет связанных вопросов^_^