基本上,我需要创建一个python文件,它接受几个随机单词的输入,并打印出文字和非文字。文义词是指在单词中每个字母都有一个相邻字母的单词。例如,铁匠是次要的,因为每个字母至少有一个相邻的字母,所以下面是程序需要的功能:
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/理解等?
任何帮助都很感激,这已经困扰了我好几个小时了!谢谢你,Itechmatrix矩阵
发布于 2014-08-12 09:25:35
这是一个来自当前国家统计局的挑战 (高级)的问题,这是一个编程竞赛。请不要为他/她做用户24492的工作。
用户24492/ there矩阵,有论坛和导师可供您使用的原因。请用这些代替。
发布于 2014-08-11 10:20:26
这在(至少)两个功能中要容易得多:
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这些字符(,我将把这个实现留给您),这样:
>>> 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中--实验中,看看哪里最适合。
注意,至少根据维基百科的定义,非副目录并不像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进行轻微的修改。
发布于 2014-08-11 10:12:32
一些小贴士:
创建一个函数:
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现在,您已经将您的副逻辑从主循环中分离出来。然后,您可以独立地测试该函数,并确保它正在做您想做的事情。
然后,你可以简单地在每一个单词上调用它。
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函数:
words_tested = [w, is_vicinal(w) for w in line.split()]然后给出一个清单:
[('word',False)] ... 注意:
我上面的is_vicinal函数可能不是完全正确的。但我相信这是正确的方向。:-)
https://stackoverflow.com/questions/25240554
复制相似问题