python字典键不工作

python字典键不工作,python,defaultdict,Python,Defaultdict,我很难访问我制作的字典中的一些值。在我的代码中,我在读取文件时制作了两个不同的词典。我的代码是: 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] == "'" :

我很难访问我制作的字典中的一些值。在我的代码中,我在读取文件时制作了两个不同的词典。我的代码是:

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:[“have”]}。 问题是,例如,如果i=Aux,当我实际想要等于[“have”]时,x被设置为一个空列表


我不确定我在做什么/访问错误。有什么想法吗?谢谢

通过阅读您的代码,我假设您想要所有以''开头和结尾的东西,对吗?在这种情况下,您可能需要

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

因为0是字符串的第一个字符:)。如果“不是拆分字符串的第二个字符,那么现在它会将所有内容添加到非终端规则中。

如果试图将
终端规则设置为长度为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}

将输出显示为self.original\u grammar.terminal\u rules.items()的结果可能会更容易,您可能希望同时显示terminal\u规则和non\u terminal\u规则。通过这种方式查看字典会更容易,而不必单独查看键/值。输出中没有空列表,
[“,”]
不被视为空列表。使用键:值对
{“Aux”:[“have”]}
i==“Aux”
非终端_规则[i]==“have”
,以及
终端_规则[j[0]
是一个
键错误
,这意味着对于
defaultdict(list)
来说,它创建一个空列表并将其分配给
x
。这是典型的XY问题。你想解决什么问题?@adsmith我不确定XY问题是什么。这是我的(公认的粗糙)尝试将语法转换为乔姆斯基范式。问题是,我不知道为什么会出现关键错误。因为例如,非终结符[I]将生成一个列表,如果列表是[“Aux”],我可以查看IDE中的变量窗口并看到[“Aux”]在terminal_rules中作为一个键存在,但我似乎无法找到它。是的,这是我的想法,但当我使用RHS[0]而不是RHS[1]时,字典会变成空的,我不知道为什么…不完全是。非terminal_rules[I]应该生成列表列表。如果此生成的列表只有一个成员长,我想查找该列表的第一个索引,将其用作terminal_规则中的键,然后保存与其关联的值。我可以在“变量”窗口中查看terminal_规则何时具有给定的键,但即使我可以看到它在那里,代码似乎也不完整生成第二个键并返回一个空列表。下面是一个示例。假设非终端_规则有一个条目{AUX:['AUX']},在终端_规则中有一个条目{AUX:[“is”,“was”]}。我最终想要的是创建一个类似于{AUX:[“is”,“was”]}的新词典。我需要对许多条目执行此操作,通过,并且仅当非终结_规则中的对具有len==1的值时(即不适用于{S:[NP,VP]}之类的条目)