将两个列表列表组合到一个字典python中

时间:2014-02-03 12:22:36

标签: python

我没有编程经验,我将两个解析句子列表(列表中的列表)组合成一个字典。我正在使用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等,但它肯定不是字典 - 而是一个元组列表。

有没有人知道是否有可能将这个结构变成一个以英语句子为键,德语句子为值的字典?或者有更好的方法来处理并行数据?

我真的很感谢你的帮助!

4 个答案:

答案 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))