使用嵌套循环过滤理解列表中的字符串

时间:2015-03-26 12:10:18

标签: python

我想知道是否有可能在理解中处理这个问题 名单 有些人喜欢:

text = "give the most longest word"
def LongestWord(text):
    l = 0
    words = list()
    for x in text.split():
        word = ''.join(y for y in x if y.isalnum())
        words.append(word)
    for word in words:
        if l < len(word):
            l = len(word)
            r = word
    return r         

3 个答案:

答案 0 :(得分:1)

不是一个而是两个列表理解:

s = 'ab, c d'
cmpfn = lambda x: -len(x)
sorted([''.join(y for y in x if y.isalnum()) for x in s.split()], key=cmpfn)[0]

答案 1 :(得分:1)

零列表理解:

import re
def longest_word(text):
    return sorted(re.findall(r'\w+', text), key=len, reverse=True)[0]

print(longest_word("this is an example.")) # prints "example"

或者,如果你坚持,同样的事情,但列表理解:

def longest_word(text):
    return [w for w in sorted(re.findall(r'\w+', text), key=len, reverse=True)][0]

答案 2 :(得分:0)

真的不需要列表理解。

import re
my_longest_word =  max(re.findall(r'\w+', text), key=len)

或者,如果 想要import re,则可以避免使用lambda表达式,并再次使用max使用一个列表推导:

my_longest_word =  max([ ''.join(l for l in word if l.isalnum()) 
                     for w in text.split() ], key = len)

这是如何运作的:

  • 使用列表推导和isalnum()过滤掉评估每个单词中每个字母的非字母数字字符,并使用空格分成列表。
  • 再次获取max

正则表达式解决方案的工作原理:

  • 匹配至少长度为1的所有字母数字与\w+
  • findall()将匹配项置于字符串列表中
  • Max从列表中查找具有最大长度的元素。

输出(在两种情况下):

>>>text = "give the most longest word"
>>>my_longest_word
'longest'
>>>text = "what!! is ??with !@#$ these special CharACTERS?"
>>>my_longest_word
'CharACTERS'