找到最长的单词不起作用

时间:2015-07-04 17:15:01

标签: python string list

所以我在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是"令人困惑的/:句子:/"

代码返回令人困惑,这是正确的答案。但是当测试用例是当前代码中的那个时,我的代码将返回'这个'而不是混淆'

有关为何发生这种情况的任何想法?

4 个答案:

答案 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"))