所以我在coderbyte.com上进行探索,其中一个挑战是找到字符串中最长的单词。我这样做的代码如下:
def LongestWord(sen):
current="";
currentBest=0
numberOfLettersInWord=0
longestWord=0
temp=sen.split()
for item in temp:
listOfCharacters=list(item)
for currentChar in listOfCharacters:
if currentChar.isalpha():
numberOfLettersInWord+=1
if numberOfLettersInWord>longestWord:
longestWord=numberOfLettersInWord
numberOfLettersInWord=0
currentBest=item
z = list(currentBest)
x=''
for item in z:
if item.isalpha(): x+=item
return x
testCase="a confusing /:sentence:/ this"
print LongestWord(testCase)
当testCase是"令人困惑的/:句子:/"
代码返回令人困惑,这是正确的答案。但是当测试用例是当前代码中的那个时,我的代码将返回'这个'而不是混淆'
有关为何发生这种情况的任何想法?
答案 0 :(得分:0)
让我建议另一种方法,它更模块化,更具Pythonic。
让我们来测量字长:
def word_length(w):
return sum(ch.isalpha() for ch in w)
因此它会计算(使用sum()
).isalpha()
为True
的字符数:
>>>
word_length('hello!!!')
5
>>>
word_length('/:sentence:/')
8
现在,从单词列表中创建一个长度列表。使用map()
:
>>>
sen = 'a confusing /:sentence:/ this'.split()
>>>
map(word_length, sen)
[1,9,8,4]
另一个用于查找列表中最大值的内置函数是max()
:
>>>
max(map(word_length, sen))
9
但是你想知道最大化长度的词,用数学术语称为argument of the maximum。
要解决此问题,zip()
使用单词的长度,并获取max()
找到的第二个参数。
由于这在许多情况下很有用,所以要使它成为一个函数:
def arg_max(func, values):
return max(zip(map(func, values), values))[1]
现在可以轻松找到最长的单词:
>>>
arg_max(word_length, sen)
'混淆'
注意:PEP-0008 (Style Guide for Python Code)表示函数名称为小写,单词用下划线分隔。
答案 1 :(得分:0)
我知道这不是你问题的答案,但这就是我计算最长字的方法。不分享,也不会帮助你:
import re
def func(text: str) -> str:
words = re.findall(r"[\w]+", text)
return max(words, key=len)
print(func('a confusing /:sentence:/ this'))
答案 2 :(得分:-1)
你循环编写句子的单词。但是,numberOfLettersInWord
永远不会重置,因此当您在单词之间进行迭代时,它会不断增加。
每次开始使用新单词时,您都必须将计数器设置为0
。
for item in temp:
numberOfLettersInWord = 0
它可以解决您的问题:https://ideone.com/y1cmHX
答案 3 :(得分:-2)
这里有一个我刚写的函数,它将返回最长的单词,使用正则表达式删除非字母数字字符
import re
def longest_word(input):
words = input.split()
longest = ''
for word in words:
word = re.sub(r'\W+', '', word)
if len(word) > len(longest):
longest = word
return longest
print(longest_word("a confusing /:sentence:/ this"))