我有一个格式的文本文件
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 mydict
s。标准库在这方面也有帮助。word
是一个有点像列表的数据结构,只是它不记得元素的顺序,并且它会自动删除重复项。(在引擎盖下,它的工作方式类似于只有键而没有值的set
。)我们只需要将
dict
函数从defaultdict
更改为list
,并将set
方法更改为在append
s上工作的版本(称为set
)from collections import defaultdict
mydict = defaultdict(set)
for line in myfile.splitlines():
word, lemma = line.split()
mydict[lemma].add(word)