2014-01-23 99 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]]) 

这里是键值,以我的字典:

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'"])]) 

比方说,我有键值对{奥克斯:“有”]}。 问题是,如果我=辅助,例如,x只是设置为一个空列表,当我真的想等于[“有”]。

我不知道我在做什么/访问不正确。有任何想法吗?谢谢!

+0

这将会是可能更容易显示输出的结果self.original_grammar.terminal_rules.items(),并且您可能想要为terminal_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]应该产生一个列表清单。如果这个生成的列表只有一个成员,我想查找该列表的第一个索引,将它用作terminal_rules中的键,然后保存其关联的值。我可以查看我的变量窗口,看看terminal_rules何时有一个给定的密钥,但即使我看到它在那里,代码似乎也会产生第二个密钥并返回一个空列表。 – user3229872

+0

这是一个例子。假设nonterminal_rules有一个条目{AUX:['Aux']},并且在terminal_rules中有条目{Aux:[“is”,“was”]}。我最终想要创建一个新的字典,就像{AUX:[“is”,“was”]}。我需要为一些条目执行此操作,并且只有当nonterminal_rules中的对的值为len == 1时(即不适用于{S:[NP,VP]等条目) – user3229872