首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测邻近词

检测邻近词
EN

Stack Overflow用户
提问于 2014-08-11 09:57:39
回答 4查看 405关注 0票数 2

基本上,我需要创建一个python文件,它接受几个随机单词的输入,并打印出文字和非文字。文义词是指在单词中每个字母都有一个相邻字母的单词。例如,铁匠是次要的,因为每个字母至少有一个相邻的字母,所以下面是程序需要的功能:

代码语言:javascript
复制
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比较似乎不起作用,而且由于某种原因,我得到了一个糟糕的输出。

代码语言:javascript
复制
line = input('Line: ').lower().split()
for item in line:
  listy = []
  nonvicinals = []
  yesvicinals = []
  vicinal = True
  for letter in item:
    listy.append(ord(letter))
  for num in listy:
    if int(num) != 97 or int(num) != 122:
      # because if it is a or z (97, 122) the number can wrap around
      if (num + 1) in listy or (num - 1) in listy:
        vicinal = True
      else:
        vicinal = False
    else:
      if int(num) == 97:
        if (num + 1) in listy or 122 in listy:
          vicinal = True
        else:
          vicinal = False
      else:
        if (num - 1) in listy or 97 in listy:
          vicinal = True
        else:
          vicinal = False
    if vicinal == False:
      nonvicinals.append(item) 
      break
  if vicinal == True:
    yesvicinals.append(item)

if yesvicinals:
  print('vicinals: {}'.format(' '.join(yesvicinals)))
if nonvicinals:
  print('Non-vicinals: {}'.format(' '.join(nonvicinals)))

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

代码语言:javascript
复制
Line: The blacksmith fights in the tower
Non-vicinals: tower

我做错了什么,为什么我没有得到想要的输出?而且,坦率地说,我的代码非常长,非常难看。是否有更快的方法使用一些lambdas/理解等?

任何帮助都很感激,这已经困扰了我好几个小时了!谢谢你,Itechmatrix矩阵

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-12 09:25:35

这是一个来自当前国家统计局的挑战 (高级)的问题,这是一个编程竞赛。请不要为他/她做用户24492的工作。

用户24492/ there矩阵,有论坛和导师可供您使用的原因。请用这些代替。

票数 3
EN

Stack Overflow用户

发布于 2014-08-11 10:20:26

这在(至少)两个功能中要容易得多:

代码语言:javascript
复制
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),并且希望查看相邻的字符(建议排序):

代码语言:javascript
复制
>>> sorted(set("blacksmith"))
['a', 'b', 'c', 'h', 'i', 'k', 'l', 'm', 's', 't']

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

代码语言:javascript
复制
>>> group(['a', 'b', 'c', 'h', 'i', 'k', 'l', 'm', 's', 't'])
[['a', 'b', 'c'], ['h', 'i'], ['k', 'l', 'm'], ['s', 't']]

现在,我们的is_vicinal函数变得容易了:

代码语言:javascript
复制
>>> 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'添加额外的逻辑!您可以将其放在groupis_vicinal中--实验中,看看哪里最适合。

注意,至少根据维基百科的定义,非副目录并不像not is_vicinal那么简单,因此您可能需要编写另一个函数def is_non_vicinal(word):来处理这个问题。这将非常类似于is_vicinal函数,并且仍然可以使用group (这就是为什么区分单独的函数很好)。

代码语言:javascript
复制
>>> is_non_vicinal("tower")
True
>>> is_vicinal("almanac")
False
>>> is_non_vicinal("almanac")
False

这还需要对process进行轻微的修改。

票数 4
EN

Stack Overflow用户

发布于 2014-08-11 10:12:32

一些小贴士:

创建一个函数:

代码语言:javascript
复制
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

现在,您已经将您的副逻辑从主循环中分离出来。然后,您可以独立地测试该函数,并确保它正在做您想做的事情。

然后,你可以简单地在每一个单词上调用它。

代码语言:javascript
复制
vicinals = [w for w in line.split() if is_vicinal(w)]
non_vicinials = [w for w in line.split() if not is_vicinal(w)]

例如。

您可以将这两者结合起来,以便每个字只运行一次is_vicinal函数:

代码语言:javascript
复制
words_tested = [w, is_vicinal(w) for w in line.split()]

然后给出一个清单:

代码语言:javascript
复制
[('word',False)] ... 

注意:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25240554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档