.我正在尝试编写一个脚本-read_dict(dictionary)-该脚本以.txt文件为参数,并给出文件中每个单词的单词部分的字典。这些部分是每个单词的第一个和最后一个字母,以及其余的字母。例如,如果文件如下:
===dictionary.txt===
quack qk
quick qk
going gg
gathering gg
quirk qk
quicken qn
输出应为:
{'qk':{'uac','uic'},'gg':{'oin','atherin'},'qn':{'uicke'}}
我这样写:
def outside(word):
a = word.strip()[0]
b = word.strip()[-1]
out_word = a + b
return out_word
def inside(word):
a = word.strip()[1:-1]
return a
def read_dict(dictionary):
a = {}
with open(dictionary, 'r') as text:
data = text.readlines()
for i in data:
a[outside(i)] = inside(i)
return a
但是我的输出是:
{'qk':'uac','gg':'oin','qn':'uicke'}
它只保存第一个单词。我也找不到一种方法来收集集合中所有具有相同字母的内部(单词),然后使用适当的键(例如“ qk”)将它们添加到字典中。
问题来源:stackoverflow
正如@ Ch3steR所说,这可以通过collections.defaultdict
轻松实现。修改您的代码为此:
from collections import defaultdict
def read_dict(dictionary):
a = defaultdict(set)
with open(dictionary, 'r') as text:
data = text.readlines()
for i in data:
a[outside(i)].add(inside(i))
return a
如果您不想使用任何外部库,则可以执行以下操作:
def read_dict(dictionary):
a = {}
with open(dictionary, 'r') as text:
data = text.readlines()
for i in data:
key = outside(i)
if key in a:
a[key].add(inside(i))
else:
a[key] = {inside(i)}
return a
通过比较两个代码片段,您还可以了解collections.defaultdict的作用以及如何使您编写更少的代码。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。