检测邻接词

2024-09-30 22:14:13 发布

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

基本上,我需要创建一个python文件,它接受一些随机单词的输入,并打印回vinic单词和非vinic单词。葡萄酒词是指每个字母都有一个相邻的字母的单词。E、 G铁匠是邻接的,因为每个字母至少有一个相邻的字母,所以程序需要如下功能:

Line: The blacksmith fights in the tower
Vicinals: blacksmith fights
Non-vicinals: The in the tower
Line: The baker fights in the street
Vicinals: fights
Non-vicinals: The in the
Line: The butcher flees from the scene
Non-vicinals: The from the scene
Line: 

到目前为止,基本上我还没有把它放到一个循环中,但是看起来我的ord比较不起作用,而且由于某种原因,我得到了一个糟糕的输出。在

^{pr2}$

现在我在第一个例子中得到的输出:

Line: The blacksmith fights in the tower
Non-vicinals: tower

我做错了什么?为什么我没有得到想要的输出? 我的代码也很长很难看。有没有更快的方法使用lambdas/理解等?在

感谢任何帮助,这已经困扰我好几个小时了! 谢谢, Itechmatrix公司


Tags: theinfrom字母linescene单词tower
3条回答

这是来自当前的NCSS Challenge(高级)的一个问题,这是一个编程竞赛。请不要为用户24492工作。在

用户24492/Itechmatrix,有论坛和导师可供您选择。请用那些代替。在

一些提示:

创建函数:

def is_vicinal(word):
    letters = [ord(l) for l in word]
    for letter in letters:
        if letter - 1 not in letters and letter + 1 not in letters:
            if letter == 97 and 122 in letters:
                continue
            elif letter == 122 and 97 in letters:
                continue
            else:
                return False
    return True

现在你已经把你的邻域逻辑从主循环中分离出来了。然后,您可以独立地测试该函数,并确保它正在执行您想要的操作。在

然后你就可以简单地对每个词进行调用。在

^{pr2}$

例如。在

您可以将这两者结合起来,以便每个单词只运行一次is\u-vical函数:

words_tested = [w, is_vicinal(w) for w in line.split()]

然后给出一个列表:

[('word',False)] ... 

注:

我上面的功能可能不完全正确。但我相信这是正确的方向。:-)

这在(至少)两个功能中更容易实现:

def process(line):
    vicinals = []
    non_vicinals = []
    for word in line.split():
        if is_vicinal(word):
            vicinals.append(word)
        else:
            non_vicinals.append(word)
    if vicinals:
        print('vicinals: {}'.format(' '.join(vicinals)))
    if non_vicinals:
        print('Non-vicinals: {}'.format(' '.join(non_vicinals)))

def is_vicinal(word):
    raise NotImplementedError()

line = input('Line: ').lower()
process(line)

现在我们可以开发和测试is_vicinal,而不必担心任何显示或输入内容。在


接下来,请注意,您只想处理唯一字符,而不关心word内的顺序(建议使用set),并且希望查看相邻字符(建议排序):

^{pr2}$

现在我们想group这些字符(我将把这个实现留给您),这样:

>>> group(['a', 'b', 'c', 'h', 'i', 'k', 'l', 'm', 's', 't'])
[['a', 'b', 'c'], ['h', 'i'], ['k', 'l', 'm'], ['s', 't']]

现在我们的is_vicinal函数变得很简单:

>>> def is_vicinal(word)
    letters = sorted(set(word))
    return all(len(l) > 1 for l in group(letters))

>>> is_vicinal("blacksmith")
True
>>> is_vicinal("tower")
False

现在您只需为'a''z'添加额外的逻辑!你可以把它放在group或者is_vicinal-实验中,看看它在哪里最适合。在


注意,至少根据definition in Wikipedia的说法,非邻接函数并不像not is_vicinal那么简单,所以您可能需要编写另一个函数def is_non_vicinal(word):来处理这个问题。这将非常类似于is_vicinal函数,并且仍然可以使用group(这就是为什么最好分开使用不同的函数)。在

>>> is_non_vicinal("tower")
True
>>> is_vicinal("almanac")
False
>>> is_non_vicinal("almanac")
False

这还需要对process稍作修改。在

相关问题 更多 >