- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个格式的文本文件
word lemma
word lemma
word lemma
像这样
workers work
went go
going go
work work
working work
我要做的是将引理及其词收集到字典中,所以输出会像这样
{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
将覆盖任何与该 lemma
关联的现有 word
.实际上,每个词条都可以有多个与之关联的词,所以我们真正想做的是将新词添加到集合中,而不是覆盖现有值。对此建模的自然方法是使用字符串的列表字典,而不是字符串字典。
mydict = {}
for line in myfile.splitlines():
word, lemma = line.split()
if lemma in mydict:
mydict[lemma].append(word)
else:
mydict[lemma] = [word]
if
语句是什么意思?如果在 mydict
中已经有给定 lemma
的条目,那么我们将它添加到列表中。如果它不存在,我们将使用单例列表初始化该条目。
我还冒昧地使用 Python 的语法来解包序列。 word, lemma = line.split()
等同于word = line.split()[0];引理 = line.split()[1]
.
Python 的优点之一是标准库可以处理许多简单的任务。这种用例正是标准库的 defaultdict
专为。当您使用下标运算符 (dict[x]
) 对 defaultdict
进行索引时,如果未找到值,则会使用您提供的函数创建该值。在这里,我们告诉 defaultdict
初始化一个新列表。
from collections import defaultdict
mydict = defaultdict(list)
现在代码更简单了,因为 defaultdict
负责为我们检查 if lemma in mydict
。它总是会返回一个(可能是空的)列表,我们可以在其中添加单词。
for line in myfile.splitlines():
word, lemma = line.split()
mydict[lemma].append(word)
在评论中,您建议不要在输出中出现重复的 word
。标准库在这里也可以提供帮助。 set
是一种有点像列表的数据结构,只是它不会记住元素的顺序,它会自动删除重复项。 (在幕后,它的工作方式类似于只有键而没有值的 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)
关于python - 在字典中用词收集引理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33352004/
我是一名优秀的程序员,十分优秀!