如何从以相同字母开头和结尾的单词中创建单词部分词典

2024-06-16 09:59:14 发布

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

我正在尝试编写一个脚本-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”)将它们添加到字典中


Tags: 文件txtreaddictionaryreturn字典def字母
2条回答

您需要将a[outside(i)]列成一个列表,并将每个新项目追加到列表中,而不是在每次找到新项目时将其覆盖

还有,既然文件中已经有了单词的第一个和最后一个字母,为什么还要抓取它们呢

def read_dict(dictionary):
    a = {}

    with open(dictionary, 'r') as text:
        data = text.readlines()
        value, key = data.split(' ')

        if key not in a:
            a[key] = []

        a[key].append(value[1:-1])

    return a

正如@Ch3steR所说,这可以通过^{}轻松实现。将您的代码修改为:

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的作用以及它如何允许您编写更少的代码

相关问题 更多 >