Python:查找字符串中最长的单词

时间:2015-03-11 09:05:29

标签: python string

我正在准备考试,但我遇到了一个过去的纸质问题。给定一个包含句子的字符串,我想找到该句子中最长的单词并返回该单词及其长度。 编辑:我只需要返回长度,但感谢您对原始问题的回答!它可以帮助我了解更多。谢谢。

例如:string =“你好我喜欢cookies”。然后我的程序应该返回“Cookies”并且长度为7。

现在的问题是,我不允许使用String类中的任何函数来获得满分,而对于满分,我只能通过字符串一次。我不允许使用string.split()(否则不会有任何问题),解决方案不应该有太多的for和while语句。字符串只包含字母和空格,单词用一个空格分隔。

有什么建议吗?我输了,我没有任何代码。

感谢。

编辑:对不起,我误读了考试题目。你只需要返回它看起来最长的单词的长度,而不是长度+单词。

EDIT2 :好的,在你的帮助下,我想我正在做点什么......

def longestword(x):
      alist = []
      length = 0
      for letter in x:
             if letter != " ":
                     length += 1
             else:
                     alist.append(length)
                     length = 0
      return alist

但它返回[5,1,4]为“你好我喜欢饼干”所以它错过了“cookies”。为什么?编辑:好的,我明白了。这是因为句子中的最后一个字母后面没有“”,因此它不会追加长度。我修复它所以它现在返回[5,1,4,7]然后我只取最大值。

我想使用列表但不是.split()可以吗?它只是说“字符串”中的函数是不允许的,或列出字符串的一部分?

13 个答案:

答案 0 :(得分:3)

您可以尝试使用正则表达式:

import re

string = "Hello I like cookies"
word_pattern = "\w+"

regex = re.compile(word_pattern)
words_found = regex.findall(string)

if words_found:
    longest_word = max(words_found, key=lambda word: len(word))
    print(longest_word)

答案 1 :(得分:2)

一次通过寻找最大值很容易:

current_max = 0
for v in values:
    if v>current_max:
        current_max = v

但在你的情况下,你需要找到这些词。记住这句话(属于J. Zawinski):

  

有些人在面对问题时会想到,我知道,我会使用正则表达式。"现在他们有两个问题。

除了使用正则表达式之外,您还可以检查单词是否包含字母。第一种方法是遍历列表并检测单词的开头或结尾:

current_word = ''
current_longest = ''
for c in mystring:
    if c in string.ascii_letters:
        current_word += c
    else:
        if len(current_word)>len(current_longest):
            current_longest = current_word
            current_word = ''
else:
    if len(current_word)>len(current_longest):
        current_longest = current_word

最后一种方法是在生成器中拆分单词并找到它产生的最大值(这里我使用了max函数):

def split_words(mystring):
    current = []
    for c in mystring:
        if c in string.ascii_letters:
            current.append(c)
        else:
            if current:
                yield ''.join(current)
max(split_words(mystring), key=len)

答案 2 :(得分:1)

只搜索非空白字符组,然后按长度查找最大值:

longest = len(max(re.findall(r'\S+',string), key = len))

答案 3 :(得分:1)

这很简单:

def long_word(s):
    n = max(s.split())
    return(n)

IN [48]: long_word('a bb ccc dddd')

Out [48]: 'dddd'

答案 4 :(得分:1)

对于python 3.如果句子中的两个词的长度相同,那么它将返回首先出现的单词。

def findMaximum(word):
    li=word.split()
    li=list(li)
    op=[]
    for i in li:
        op.append(len(i))
    l=op.index(max(op))
    print (li[l])
findMaximum(input("Enter your word:"))

答案 5 :(得分:0)

我可以看到想象一些不同的选择。 Regular expressions可能会做很多你需要做的分裂。如果您了解正则表达式,这可能是一个简单的选项。

另一种方法是将字符串视为列表,迭代它以跟踪索引,并查看每个字符以查看是否结束了单词。然后你只需要保留最长的单词(最长的索引差异),你应该找到答案。

答案 6 :(得分:0)

正则表达式似乎是您最好的选择。首先使用re来分割句子:

>>> import re
>>> string = "Hello I like cookies"
>>> string = re.findall(r'\S+',string)

\S+查找所有非空白字符并将它们放在列表中:

>>> string
['Hello', 'I', 'like', 'cookies']

现在你可以找到包含最长单词的list元素的长度,然后使用list comprehension来检索元素本身:

>>> maxlen = max(len(word) for word in string)
>>> maxlen
7
>>> [word for word in string if len(word) == maxlen]
['cookies']

答案 7 :(得分:0)

此方法仅使用一个for循环,不使用String类中的任何方法,仅严格访问每个字符一次。您可能需要根据字数作为单词的一部分进行修改。

s = "Hello I like cookies"
word = ''
maxLen = 0
maxWord = ''
for c in s+' ':
    if c == ' ':
        if len(word) > maxLen:
            maxWord = word
        word = ''
    else:
        word += c


print "Longest word:", maxWord
print "Length:", len(maxWord)

答案 8 :(得分:0)

鉴于你不允许使用string.split()我想使用正则表达式做同样的事情也应该被排除。

我不想为你解决你的运动,但这里有一些指示:

  • 假设您有一个数字列表,并且想要返回最高值。你会怎么做?您需要跟踪哪些信息?
  • 现在,给定您的字符串,您将如何构建所有字长的列表?你需要跟踪什么?
  • 现在,您只需将两种逻辑交织在一起,因此在您浏览字符串时会比较计算出的字长。

答案 9 :(得分:0)

我的建议......

import re
def longer_word(sentence):
    word_list = re.findall("\w+", sentence)
    word_list.sort(cmp=lambda a,b: cmp(len(b),len(a)))
    longer_word = word_list[0]
    print "The longer word is '"+longer_word+"' with a size of", len(longer_word), "characters."
longer_word("Hello I like cookies")

答案 10 :(得分:0)

import re

def longest_word(sen):
  res = re.findall(r"\w+",sen)
  n = max(res,key = lambda x : len(x))
  return n

print(longest_word("Hey!! there, How is it going????"))

输出

在这里,我已使用regex解决该问题。变量“ res” 查找字符串中的所有单词,并将它们拆分后本身存储在列表中。 它使用split()将所有字​​符存储在列表中,然后regex完成工作。

findall关键字用于在字符串中查找所有所需的实例。这里定义了\w+,它告诉编译器查找所有单词,且不带空格。

变量“ n” 从给定的字符串中找到最长的单词,该单词现在不再包含任何不需要的字符。

变量“ n” 使用lambda expressions在此处定义键len()

变量“ n” 从“ res”中找到最长的单词,该单词已删除所有非字符串字符,如%,&,!!等

>>>#import regular expressions for the problem.**
>>>import re

>>>#initialize a sentence
>>>sen = "fun&!! time zone"

>>>res = re.findall(r"\w+",sen)
>>>#res variable finds all the words and then stores them in a list.

>>>res
Out: ['fun','time','zone']

>>>n = max(res)
Out: zone

>>>#Here we get "zone" instead of "time" because here the compiler
>>>#sees "zone" with the higher value than "time".
>>>#The max() function returns the item with the highest value, or the item with the highest value in an iterable.

>>>n = max(res,key = lambda x:len(x))
>>>n
Out: time

在这里我们得到“时间” ,因为lambda表达式会丢弃“区域” ,因为它看到键是len()中的max()函数

答案 11 :(得分:0)

在先前提供的解决方案中发现错误,他是纠正措施:

def longestWord(text):
    
    current_word = ''
    current_longest = ''
    for c in text:
        if c in string.ascii_letters:
            current_word += c
        else:
            if len(current_word)>len(current_longest):
                current_longest = current_word
            current_word = ''    

    if len(current_word)>len(current_longest):
        current_longest = current_word
    return   current_longest

答案 12 :(得分:-1)

add_filter('woocommerce_get_catalog_ordering_args', 'am_woocommerce_catalog_orderby');
    function am_woocommerce_catalog_orderby( $args ) {
        $args['meta_key'] = '_sku';
        $args['orderby'] = 'meta_value_num';
        $args['order'] = 'desc'; 
        return $args;
    }

输出-独立