我有一个格式的文本文件

word lemma
word lemma
word lemma

这样地
workers  work
went     go
going    go
work     work
working  work

我要做的是用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'}

有人能帮忙吗?

最佳答案

你的代码几乎是正确的!问题是mydict[lemma] = word将覆盖与word相关联的任何现有的lemma s。实际上,每个引理都可以有一个以上的单词与之关联,所以我们真正想要做的是将新单词添加到集合中,而不是重写现有的值。建模的自然方法是使用字符串列表的dict,而不是字符串的dict。

mydict = {}
for line in myfile.splitlines():
    word, lemma = line.split()
    if lemma in mydict:
        mydict[lemma].append(word)
    else:
        mydict[lemma] = [word]

这句话是什么意思?如果if中已有给定lemma的条目,则将其添加到列表中。如果还没有,我们用一个单子列表初始化条目。
我还冒昧地使用了Python的语法来解包序列。mydict相当于word, lemma = line.split()
Python的一个优点是许多简单的任务由标准库提供。这种用例正是标准库word = line.split()[0]; lemma = line.split()[1]的设计目的。使用下标运算符(defaultdict)索引到defaultdict时,如果找不到值,则使用您提供的函数创建该值。在这里,我们告诉dict[x]初始化一个新列表。
from collections import defaultdict
mydict = defaultdict(list)

现在代码更简单了,因为defaultdict负责为我们检查defaultdict。它总是会给我们一个(可能是空的)列表,我们可以添加这个词。
for line in myfile.splitlines():
    word, lemma = line.split()
    mydict[lemma].append(word)

在一条评论中,您建议不要在输出中重复if lemma in mydicts。标准库在这方面也有帮助。word是一个有点像列表的数据结构,只是它不记得元素的顺序,并且它会自动删除重复项。(在引擎盖下,它的工作方式类似于只有键而没有值的set。)
我们只需要将dict函数从defaultdict更改为list,并将set方法更改为在appends上工作的版本(称为set
from collections import defaultdict
mydict = defaultdict(set)

for line in myfile.splitlines():
    word, lemma = line.split()
    mydict[lemma].add(word)

10-06 10:32