我需要像这样转换列表列表:
[['S', 'NP', 'VP'], ['NP', 'Det', 'N'], ['NP', 'NP', 'PP'], ['VP', 'V', 'NP'], ['VP', 'VP', 'PP'], ['PP', 'P', 'NP'], ['Det', "'the'"], ['N', "'pirate'"], ['N', "'sailor'"], ['N', "'telescope'"], ['V', "'sees'"], ['P', "'with'"]]
像这样的字典:
{'S':['NP', 'VP'], 'NP': ['Det', 'N'], ['NP', 'PP'], 'VP': ['V', 'NP'], ['VP', 'PP'], 'PP': ['P', 'NP'], 'Det': ["'the'"], 'N': ["'pirate'"], ["'sailor'"], ["'telescope'"], 'V': ["'sees'"], 'P': ["'with'"]}
我尝试通过from collections import default dict
使用此方法:
g = defaultdict(dict)
for i, j, k in new_grammar:
g[i][j] = k
但这不起作用,因为列表列表中只有两个元素。
我也尝试过:
grammar = {}
for rule in new_grammar:
grammar[rule[0]] = rule[1:]
但是,这只给每个键一个值。
有什么办法吗?
答案 0 :(得分:4)
您处在正确的轨道上,但是defaultdict是从字符串到列表的映射,而不是字典。试试这个:
g = defaultdict(list)
for i in new_grammar:
g[i[0]].extend(i[1:])
答案 1 :(得分:2)
这是使用collections.defaultdict
的一种方式。
请注意,结果是一个字典,其中包含分配给每个键的值的列表。这不是您定义所需输出的方式,这不是有效的Python。
L = [['S', 'NP', 'VP'], ['NP', 'Det', 'N'], ['NP', 'NP', 'PP'], ['VP', 'V', 'NP'], ['VP', 'VP', 'PP'], ['PP', 'P', 'NP'], ['Det', "'the'"], ['N', "'pirate'"], ['N', "'sailor'"], ['N', "'telescope'"], ['V', "'sees'"], ['P', "'with'"]]
from collections import defaultdict
d = defaultdict(list)
for k, *v in L:
d[k].extend(v)
print(d)
defaultdict(list,
{'Det': ["'the'"],
'N': ["'pirate'", "'sailor'", "'telescope'"],
'NP': ['Det', 'N', 'NP', 'PP'],
'P': ["'with'"],
'PP': ['P', 'NP'],
'S': ['NP', 'VP'],
'V': ["'sees'"],
'VP': ['V', 'NP', 'VP', 'PP']})
答案 2 :(得分:0)
为什么不仅如此?还是您想要的??
l = [['S', 'NP', 'VP'], ['NP', 'Det', 'N'], ['NP', 'NP', 'PP'], ['VP', 'V', 'NP'], ['VP', 'VP', 'PP'], ['PP', 'P', 'NP'], ['Det', "'the'"], ['N', "'pirate'"], ['N', "'sailor'"], ['N', "'telescope'"], ['V', "'sees'"], ['P', "'with'"]]
print(dict(zip([i[0] for i in l],[i[1:] for i in l])))
输出:
{'S': ['NP', 'VP'], 'NP': ['NP', 'PP'], 'VP': ['VP', 'PP'], 'PP': ['P', 'NP'], 'Det': ["'the'"], 'N': ["'telescope'"], 'V': ["'sees'"], 'P': ["'with'"]}
答案 3 :(得分:0)
如何? 如果element不存在,则添加到字典中。如果元素存在,则追加到字典。
l = [['S', 'NP', 'VP'], ['NP', 'Det', 'N'], ['NP', 'NP', 'PP'], ['VP', 'V', 'NP'], ['VP', 'VP', 'PP'], ['PP', 'P', 'NP'], ['Det', "'the'"], ['N', "'pirate'"], ['N', "'sailor'"], ['N', "'telescope'"], ['V', "'sees'"], ['P', "'with'"]]
grammar = {}
for rule in l:
if(grammar.get(rule[0],None) == None):
grammar[rule[0]] = rule[1:]
else:
for elem in rule[1:]:
grammar[rule[0]].append(elem)
print grammar
答案 4 :(得分:0)
也可以使用itertools.groupby()
:
from itertools import groupby
from itertools import chain
from operator import itemgetter
from pprint import pprint
L = [['S', 'NP', 'VP'], ['NP', 'Det', 'N'], ['NP', 'NP', 'PP'], ['VP', 'V', 'NP'], ['VP', 'VP', 'PP'], ['PP', 'P', 'NP'], ['Det', "'the'"], ['N', "'pirate'"], ['N', "'sailor'"], ['N', "'telescope'"], ['V', "'sees'"], ['P', "'with'"]]
result = {k: list(chain(*(x[1:] for x in g))) for
k, g in groupby(sorted(L, key=itemgetter(0)), key=itemgetter(0))}
pprint(result)
哪些输出:
{'Det': ["'the'"],
'N': ["'pirate'", "'sailor'", "'telescope'"],
'NP': ['Det', 'N', 'NP', 'PP'],
'P': ["'with'"],
'PP': ['P', 'NP'],
'S': ['NP', 'VP'],
'V': ["'sees'"],
'VP': ['V', 'NP', 'VP', 'PP']}