将列表转换为具有每个实体中概率的字典
Convert list to dictionary with probability in each entity
所以我有一个这样的列表:
['2 ROOT S . ', '1 ROOT S ! ', '1 ROOT is it true that S ? ', '1 S NP VP ', '1 VP Verb NP ', '1 NP DT Noun ', '1 NP NP PP ', '1 PP Prep NP ', '1 Noun Adj Noun ', '1 Verb ate ', '2 Verb wanted ', '1 Verb kissed ', '3 Verb understood ', '1 Verb pickled ', '2 DT the ', '1 DT a ', '1 DT every ', '1 Noun president ', '2 Noun sandwich ', '1 Noun pickle ', '3 Noun chief of staff ', '1 Noun floor ', '1 Adj fine ', '2 Adj delicious ', '1 Adj perplexed ', '3 Adj pickled ', '2 Prep with ', '1 Prep on ', '1 Prep under ', '3 Prep in ']
每个实体前面的数字是概率,下一个字符串是字典的键,剩下的字符串是该特定字符串的值。我需要做的是提取列表中的每个实体并将其输入到字典中。例如,对于前三个,我需要创建一个看起来像这样的字典:
dict = {
'ROOT': [['2/4'], ['1/4'], ['1/4'], ['S', '.'], ['S', '!'], ['is', 'it', 'true', 'that', 'S', '?']]
}
ROOT是key,前三个值是后三个值被随机选取的概率。可能有更好的方法来构建字典,但我对 python 还很陌生,所以我只是边走边捡。
如果可能的话,也许可以使用某种嵌套字典?
谢谢
我很惊讶没有人试一试。下面的代码并不完全按照您描述的示例执行,但(在我看来)是表达数据的更好方式。
probabilityDict = {}
for i in valueList:
if i != ' ' :
y = i.split()
typeKey = y[1]
probabilityKey = y[0] + '/4'
if typeKey not in probabilityDict:
probabilityDict[typeKey] = {}
if probabilityKey not in probabilityDict[typeKey]:
probabilityDict[typeKey][probabilityKey] = []
probabilityDict[typeKey][probabilityKey].extend(y[2:])
输出
print probabilityDict
{'ROOT': {'1/4': ['S', '!', 'is', 'it', 'true', 'that', 'S', '?'], '2/4': ['S', '.']},
'Adj': {'1/4': ['fine', 'perplexed'], '2/4': ['delicious'], '3/4': ['pickled']},
# etc... }
在您的示例中,重复了 '1/4'
。在这里你可以看到键被合并以保存所有匹配给定概率的值。以这种方式合并它的好处是您现在可以将它用作嵌套字典(如您所问)。
例如:
print probabilityDict['ROOT']['1/4']
>>> ['S', '!', 'is', 'it', 'true', 'that', 'S', '?']
我不知道你打算从这里走向何方,但请记住一些可以帮助你的有用 dict
方法。要获取迭代器(即在 for loops
中使用),请使用:
# On Python 2x
probabilityDict['Root'].iterkeys()
probabilityDict['Root'].itervalues()
probabilityDict['Root'].iteritems()
# On Python 3x
probabilityDict['Root'].keys()
probabilityDict['Root'].values()
probabilityDict['Root'].items()
请记住字典是无序数据。您必须在其余代码中考虑这一点。
所以我有一个这样的列表:
['2 ROOT S . ', '1 ROOT S ! ', '1 ROOT is it true that S ? ', '1 S NP VP ', '1 VP Verb NP ', '1 NP DT Noun ', '1 NP NP PP ', '1 PP Prep NP ', '1 Noun Adj Noun ', '1 Verb ate ', '2 Verb wanted ', '1 Verb kissed ', '3 Verb understood ', '1 Verb pickled ', '2 DT the ', '1 DT a ', '1 DT every ', '1 Noun president ', '2 Noun sandwich ', '1 Noun pickle ', '3 Noun chief of staff ', '1 Noun floor ', '1 Adj fine ', '2 Adj delicious ', '1 Adj perplexed ', '3 Adj pickled ', '2 Prep with ', '1 Prep on ', '1 Prep under ', '3 Prep in ']
每个实体前面的数字是概率,下一个字符串是字典的键,剩下的字符串是该特定字符串的值。我需要做的是提取列表中的每个实体并将其输入到字典中。例如,对于前三个,我需要创建一个看起来像这样的字典:
dict = {
'ROOT': [['2/4'], ['1/4'], ['1/4'], ['S', '.'], ['S', '!'], ['is', 'it', 'true', 'that', 'S', '?']]
}
ROOT是key,前三个值是后三个值被随机选取的概率。可能有更好的方法来构建字典,但我对 python 还很陌生,所以我只是边走边捡。
如果可能的话,也许可以使用某种嵌套字典? 谢谢
我很惊讶没有人试一试。下面的代码并不完全按照您描述的示例执行,但(在我看来)是表达数据的更好方式。
probabilityDict = {}
for i in valueList:
if i != ' ' :
y = i.split()
typeKey = y[1]
probabilityKey = y[0] + '/4'
if typeKey not in probabilityDict:
probabilityDict[typeKey] = {}
if probabilityKey not in probabilityDict[typeKey]:
probabilityDict[typeKey][probabilityKey] = []
probabilityDict[typeKey][probabilityKey].extend(y[2:])
输出
print probabilityDict
{'ROOT': {'1/4': ['S', '!', 'is', 'it', 'true', 'that', 'S', '?'], '2/4': ['S', '.']},
'Adj': {'1/4': ['fine', 'perplexed'], '2/4': ['delicious'], '3/4': ['pickled']},
# etc... }
在您的示例中,重复了 '1/4'
。在这里你可以看到键被合并以保存所有匹配给定概率的值。以这种方式合并它的好处是您现在可以将它用作嵌套字典(如您所问)。
例如:
print probabilityDict['ROOT']['1/4']
>>> ['S', '!', 'is', 'it', 'true', 'that', 'S', '?']
我不知道你打算从这里走向何方,但请记住一些可以帮助你的有用 dict
方法。要获取迭代器(即在 for loops
中使用),请使用:
# On Python 2x
probabilityDict['Root'].iterkeys()
probabilityDict['Root'].itervalues()
probabilityDict['Root'].iteritems()
# On Python 3x
probabilityDict['Root'].keys()
probabilityDict['Root'].values()
probabilityDict['Root'].items()
请记住字典是无序数据。您必须在其余代码中考虑这一点。