gpt4 book ai didi

python - 检测邻近词

转载 作者:行者123 更新时间:2023-11-28 20:06:05 25 4
gpt4 key购买 nike

基本上我需要创建一个 python 文件,它接受一些随机词的输入并打印回 vinical 词和非 vinical 词。 Vinical words 是每个字母在单词中都有一个相邻字母的单词。 E.G blacksmith 是相邻的,因为每个字母至少有一个相邻的字母,所以程序需要这样运行:

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 比较不起作用,并且由于某种原因我得到了一个糟糕的输出。

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)))

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

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

我做错了什么,为什么我没有得到想要的输出?坦率地说,我的代码真的很长而且非常丑陋。有没有使用一些 lambdas/comprehensions 等更快的方法?

感谢任何帮助,这已经困扰我好几个小时了!谢谢,技术矩阵

最佳答案

这在(至少)两个功能上会容易得多:

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),并且您希望查看在相邻字符处(建议排序):

>>> sorted(set("blacksmith"))
['a', 'b', 'c', 'h', 'i', 'k', 'l', 'm', 's', 't']

现在我们要分组这些字符(我会把这个实现留给你),这样:

>>> 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' 添加额外的逻辑!您可以将它放在 groupis_vicinal 中 - 试验并查看最适合的位置。


请注意,根据 definition in Wikipedia至少,non-vicinal 不像 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 进行轻微修改。

关于python - 检测邻近词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25240554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com