Как преобразовать список списков с отдельными списками, которые имеют один и тот же первый элемент, в словарь? - PullRequest
0 голосов
/ 27 июня 2018

Мне нужно преобразовать список списков так:

[['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:]

Однако это дает каждому ключу только одно значение.

Есть ли способ сделать это?

Ответы [ 5 ]

0 голосов
/ 27 июня 2018

Можно также использовать 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']}
0 голосов
/ 27 июня 2018

Как насчет этого: добавить в словарь, если элемента нет. Добавить в словарь, если элемент присутствует.

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
0 голосов
/ 27 июня 2018

Почему не только это? или это то, что вы хотите?:

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'"]}
0 голосов
/ 27 июня 2018

Это один из способов использования 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']})
0 голосов
/ 27 июня 2018

Вы были на правильном пути, но ваш defaultdict - это отображение строки в список, а не словарь. Попробуйте это:

g = defaultdict(list)
for i in new_grammar:
    g[i[0]].extend(i[1:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...