我有一个格式的文本文件
word lemma
word lemma
word lemma
像这样
^{pr2}$我要做的是在dict中收集引理及其单词,这样输出就会像这样
{work: workers, work, working}
{go: went, going}
我试过了
mydict = {}
for line in myfile.splitlines():
lemma = line.split()[1]
word = line.split()[0]
mydict[lemma] = word
但此代码给出以下输出:
{'work': 'working', 'go': 'going'}
有人能帮忙吗?在
正如我的评论所建议的那样,您需要列出一个列表作为您的值,而不仅仅是为每个键设置值。这样的事情应该行得通。在
我建议使用
defaultdict
,用collections
模块中的list
初始化。它适合这种情况,因为您可以轻松地添加新元素,并准备好list
来添加元素。在创建
defaultdict
很容易,方法是从集合中导入它并提供一个list
作为唯一参数:然后,可以迭代文件中的每一行,并根据
^{pr2}$lemma
的值append()
对word
进行迭代:使用您提供的输入,
print(mydict)
输出您要查找的映射:你的代码几乎是正确的!问题是
mydict[lemma] = word
将覆盖与该lemma
相关的任何现有的word
。实际上,每个引理可以有多个词与之关联,所以我们真正想做的是将新词添加到集合中,而不是重写现有的值。建模的自然方法是使用的dict列出字符串的dict,而不是string的dict。在这句话是什么意思?如果在
mydict
中已有给定lemma
的条目,那么我们将其添加到列表中。如果还没有,我们用单例列表初始化条目。在我还自由地使用Python的语法来解包序列。
word, lemma = line.split()
相当于word = line.split()[0]; lemma = line.split()[1]
。在Python的一个优点是许多简单的任务都由标准库提供。这种用例正是标准库的^{} 设计的目的。当使用下标运算符(
^{pr2}$dict[x]
)索引到defaultdict
时,如果找不到值,则使用您提供的函数创建该值。在这里,我们告诉defaultdict
初始化一个新列表。在现在代码更简单了,因为
defaultdict
负责为我们检查if lemma in mydict
。它总是会给我们一个(可能是空的)列表,我们可以在其中添加单词。在在注释中,您建议不要在输出中出现重复的} 是一个有点像列表的数据结构,只是它不记得元素的顺序,它会自动删除重复项。(在引擎盖下,它的工作方式类似于
word
。标准库也可以在这方面提供帮助。^{dict
,只有键,没有值。)我们只需要将
defaultdict
函数从list
更改为set
,并将append
方法更改为在set
上工作的版本(称为add
)相关问题 更多 >
编程相关推荐