2014-02-03 6 views
0

Я не испытываю проблем с программированием, и у меня есть проблема с объединением двух списков разборных предложений (= список внутри списка) в словарь. Я использую python 2.6.6Объединить два списка списков в словарь python

У меня есть два списка предложений, один на английском, а другой на немецком. Приговоры соответствуют: первое предложение в немецком списке - перевод первого предложения в английский список и т. Д. Моя цель - иметь доступ к английскому предложению, извлечь тему и посмотреть, соответствует ли немецкий предмет английскому языку один.

Мои два списка выглядеть следующим образом (упрощенно):

sentences_en = [[u'sid(s1).', u'sentence1', ...], [u'sid(s2).', u'sentence2', ...]] 
sentences_de = [['sid(s1).', 'Satz1', ...], ['sid(s2).', 'Satz2', ...]] 

Каждый элемент в списке содержит приговор ID, фактическое предложение ('sentenceX' или «SatzX (Сида (s1). ') '), а также дополнительную информацию о предложении («...»). Оба списка ('sentences_en', 'sentences_de') содержат 10000 элементов.

Я хотел бы сопоставить английский с немецким предложениями в параллельном словаре, который выглядит следующим образом:

parallel_dict = {[u'sid(s1).', u'sentence1', ...]:['sid(s1).', 'Satz1', ...], [u'sid(s2).', 'sentence2', ...]:['sid(s2).', 'Satz2', ....]} 

Как я знаю, что я не могу иметь список в качестве ключа, я попытался превратите один из списков в кортеж и используйте его в качестве ключа (я нашел это решение для переполнения стека). К сожалению, это не похоже на работу:

parallel_dict = {} 
tuple_sentences_en = tuple(sentences_en) 
parallel_dict = zip(tuple_sentences_en, sentences_de) 

Когда я печатаю parallel_dict, я получаю следующую структуру:

[([u'sid(s1).', u'sentence1', ...], ['sid(s1).', 'Satz1', ...]), ([u'sid(s2).', u'sentence2', ...], ['sid(s2).', 'Satz2', ...])] 

Это делает карту английского предложения 1 к германскому предложению 1 и т.д., но это, безусловно, не словарь - скорее список кортежей.

Кто-нибудь знает, возможно ли включить эту структуру в словарь с английскими предложениями как ключи и немецкие предложения в качестве значений? Или есть лучший способ работать с параллельными данными?

Я очень благодарен за вашу помощь!

+0

Вы уверены, что не хотите, чтобы два диктата, где ключ является 'sid (sNN)', а значения - предложения на соответствующем языке? (например, 'dict_en',' dict_de'). И что именно вы имеете в виду с параллельными данными? – Matt

+0

Дорогой Мэтт, я попробовал это с двумя словарями с предложением_при = ключ и предложением = значением. Однако после этого у меня возникли проблемы с доступом к данным. Я хочу иметь возможность пройти синтаксическое английское предложение и посмотреть, предшествует ли предмету в предложении статья («the», «a», «an»). Если это так, я хотел бы обратиться к соответствующему немецкому предложению и посмотреть, предшествует ли немецкому субъекту статья или нет. – user3265565

+0

@Matt: С параллельными данными я имею в виду, что у меня есть два набора данных: один на английском и один на немецком, а первое предложение на английском языке соответствует первому предложению на немецком языке (перевод), второе на второе и т. Д. (например, sentences_en = [[sid (s1) ',' I am cooking '], [' sid (s2) ',' This is good '] ...] и sentences_de = [[sid (s1)', ' Ich koche gerade '], [' sid (s2) ',' Das ist gut '] ...]) – user3265565

ответ

0

Что касается вопроса:

whether it is even possible to turn this structure into a dictionary with the English sentences as the keys and the German sentences as the values

ответ, конечно, да.Вам нужно что-то вроде понимания dict вместо zip (причина, по которой ваш метод не работает, заключается в том, что zip возвращает список, а не dict).

from itertools import izip 
sentences_en = [[u'sid(s1).', u'sentence1', 'sentence1_info'], [u'sid(s2).', u'sentence2', 'sentence2_info']] 
sentences_de = [['sid(s1).', 'Satz1', 'Staz1_info'], ['sid(s2).', 'Satz2', 'Staz2_info']] 
mapping = {s_en[1]: s_de[1] for (s_en ,s_de) in izip(sentences_en, sentences_de)} 

И mapping будет ДИКТ с английскими предложениями в качестве ключей и немецких предложений как значения, как вы хотели, чтобы это было:

{u'sentence1': 'Satz1', u'sentence2': 'Satz2'} 

выше выход ДИКТ mapping отбрасывает идентификатор и дополнительную информацию по каждому предложению, которая, как представляется, избыточна на основе вашего описания входных списков. В маловероятном случае, если вы действительно хотите, чтобы сохранить всю информацию в Словаре, это будет делать (и вы, возможно, понял это уже):

mapping2 = {tuple(s_en): s_de for (s_en ,s_de) in izip(sentences_en, sentences_de)} 
print mapping2 

Выход:

{(u'sid(s1).', u'sentence1', 'sentence1_info'): ['sid(s1).', 
               'Satz1', 
               'Staz1_info'], 
(u'sid(s2).', u'sentence2', 'sentence2_info'): ['sid(s2).', 
               'Satz2', 
               'Staz2_info']} 

хотя я думаю, что первый mapping ближе к тому, что вы хотите.

+0

Уважаемый @ YS-L. Во-вторых, это именно то, что я хочу, Мне нужно не только предложение, но и вся дополнительная информация синтаксического анализа, и он работает для моих данных! Большое вам спасибо! – user3265565

+0

Нет проблем. Вы можете рассмотреть вопрос о том, как этот вопрос решить, приняв ответ, если он как-то помогает:) –

3

Поскольку это для 2.6, использовать выражение генератора для dict() конструктора:

from itertools import izip 

dict((en[0], (en[0], de[0])) for en, de in izip(sentences_en, sentences_de)) 

Это использует izip(), чтобы не создавать промежуточный список 10000 пунктов.

Петля распаковывает каждую пару в два списка из английского и немецкого списков, прежде чем формировать пару ключ-значение для выходного словаря.

Если вы можете перейти на Python 2.7 или 3.x, вы можете использовать Dict понимание:

{en[0]: (en[0], de[0]) for en, de in izip(sentences_en, sentences_de)} 
+0

Я пробовал это, но он всегда дает мне ошибку: ValueError: слишком много значений для распаковки – user3265565

+0

@ user3265565: Ах, ваши списки ввода длиннее, я буду обновлять. –

0

я не уверен, если он может работать с кодом, но дать ему попробовать

print {tuple(k):v for k,v in zip(sentences_en, sentences_de)} 
Смежные вопросы