我没有编程经验,我将两个解析句子列表(列表中的列表)组合成一个字典。我正在使用python 2.6.6
我有两个句子列表,一个用英语,另一个用德语。句子对应:德语列表中的第一句是英语列表中第一句的翻译等。 我的目标是能够访问英语句子,提取主题并查看德语主语是否与英语主语相对应。
我的两个列表看起来像这样(简化):
sentences_en = [[u'sid(s1).', u'sentence1', ...], [u'sid(s2).', u'sentence2', ...]]
sentences_de = [['sid(s1).', 'Satz1', ...], ['sid(s2).', 'Satz2', ...]]
列表中的每个项目都包含句子ID('sid(s1)。'),实际句子('sentenceX'或'SatzX'),以及有关句子的更多信息('...') 。两个列表('sentences_en','sentences_de')包含10000个项目。
我想将英语和德语句子映射到一个如下所示的并行字典中:
parallel_dict = {[u'sid(s1).', u'sentence1', ...]:['sid(s1).', 'Satz1', ...], [u'sid(s2).', 'sentence2', ...]:['sid(s2).', 'Satz2', ....]}
我知道我不能将列表作为键,我试图将其中一个列表转换为元组并将其用作键(我在Stack Overflow上找到了这个解决方案)。不幸的是,这似乎不起作用:
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 :(得分: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)}
答案 1 :(得分:0)
我不确定它是否可以与你的代码一起使用但是试一试
print {tuple(k):v for k,v in zip(sentences_en, sentences_de)}
答案 2 :(得分:0)
关于这个问题:
是否甚至可以将此结构转换为字典,其中英语句子为键,德语句子为值
答案当然是肯定的。你需要的是像dict理解而不仅仅是zip
(你的方法不起作用的原因是zip
返回一个列表,而不是一个字典。)
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
会丢弃每个句子的ID和附加信息,根据您对输入列表的描述,这似乎是多余的。在不太可能的情况下,你真的想要保留dict中的所有信息,这样做(你可能已经想到了):
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
更接近你想要的。
答案 3 :(得分:0)
这很简单:
dict(zip(list1, list2))