收集引理及其在di中的单词

2024-04-25 22:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个格式的文本文件

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'}

有人能帮忙吗?在


Tags: go格式line单词dictmydictworkingword
3条回答

正如我的评论所建议的那样,您需要列出一个列表作为您的值,而不仅仅是为每个键设置值。这样的事情应该行得通。在

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

我建议使用defaultdict,用collections模块中的list初始化。它适合这种情况,因为您可以轻松地添加新元素,并准备好list来添加元素。在

创建defaultdict很容易,方法是从集合中导入它并提供一个list作为唯一参数:

from collections import defaultdict

mydict = defaultdict(list)

然后,可以迭代文件中的每一行,并根据lemma的值append()word进行迭代:

^{pr2}$

使用您提供的输入,print(mydict)输出您要查找的映射:

defaultdict(<type 'list'>, {'go': ['went', 'going'], 'work': ['workers', 'work', 'working']})

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

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

这句话是什么意思?如果在mydict中已有给定lemma的条目,那么我们将其添加到列表中。如果还没有,我们用单例列表初始化条目。在

我还自由地使用Python的语法来解包序列。word, lemma = line.split()相当于word = line.split()[0]; lemma = line.split()[1]。在

Python的一个优点是许多简单的任务都由标准库提供。这种用例正是标准库的^{}设计的目的。当使用下标运算符(dict[x])索引到defaultdict时,如果找不到值,则使用您提供的函数创建该值。在这里,我们告诉defaultdict初始化一个新列表。在

^{pr2}$

现在代码更简单了,因为defaultdict负责为我们检查if lemma in mydict。它总是会给我们一个(可能是空的)列表,我们可以在其中添加单词。在

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

在注释中,您建议不要在输出中出现重复的word。标准库也可以在这方面提供帮助。^{}是一个有点像列表的数据结构,只是它不记得元素的顺序,它会自动删除重复项。(在引擎盖下,它的工作方式类似于dict,只有键,没有值。)

我们只需要将defaultdict函数从list更改为set,并将append方法更改为在set上工作的版本(称为add

from collections import defaultdict
mydict = defaultdict(set)

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

相关问题 更多 >