使用Python打印字母的最长子序列
编写一段代码以打印输入字符串中最长的字母子序列。 -首先,要求用户输入任何字符串。 -代码应该打印输入字符串的最长子字符串,该字符串只包含英文字母表中的字母,包括大写和小写字母 如果存在相同最长长度的多个子序列,则代码将返回第一个子序列。使用Python打印字母的最长子序列,python,string,python-3.7,subsequence,Python,String,Python 3.7,Subsequence,编写一段代码以打印输入字符串中最长的字母子序列。 -首先,要求用户输入任何字符串。 -代码应该打印输入字符串的最长子字符串,该字符串只包含英文字母表中的字母,包括大写和小写字母 如果存在相同最长长度的多个子序列,则代码将返回第一个子序列。 如果输入不包含任何字母,函数将返回空字符串。 比如说, 对于输入字符串“ab24[AaBbCDExy0longest]”,它应该打印“AaBbCDExy” 对于输入字符串“a a1234b | c | d”,它应该打印“a” 对于输入字符串“12345”,它
如果输入不包含任何字母,函数将返回空字符串。 比如说,
- 对于输入字符串“ab24[AaBbCDExy0longest]”,它应该打印“AaBbCDExy”
- 对于输入字符串“a a1234b | c | d”,它应该打印“a”
- 对于输入字符串“12345”,它应该打印“”(空字符串)
# Your code here
#longest_letterSeq = ''
def longestSubstring(s):
longest_letterSeq = ''
i = 0
while(i<len(s)):
curr_letterSeq = ''
# For letter substring
while(i<len(s) and s[i].isalpha()):
curr_letterSeq += s[i]
i+= 1
# Case handling if the character is not letter
if(i< len(s) and not(s[i].isalpha())) :
i+= 1
if(len(curr_letterSeq) > len(longest_letterSeq) ):
longest_letterSeq = curr_letterSeq
return longest_letterSeq
str = input("Please input your string here: ")
print(longestSubstring(str))
#您的代码在这里
#最长字母顺序=“”
def longestSubstring(s):
最长字母顺序=“”
i=0
而(i一个选项是使用re.findall
和max
:
import re
max(re.findall('[a-zA-Z]+', 'ab24[AaBbCDExy0longest]'), key=len)
# 'AaBbCDExy'
max(re.findall('[a-zA-Z]+', 'a a a1234b|c|d '), key=len)
# 'a'
考虑没有匹配的情况的小技巧:
max(re.findall('[a-zA-Z]+', '12345 ') or [''], key=len)
# ''
尽管我建议您采用更具可读性的方法:
r = re.findall('[a-zA-Z]+', '12345 ')
if r:
out = max(r, key=len)
else:
out = ''
或者正如@deepstop对条件表达式的建议:
out = max(r, key=len) if r else ''
一个选项是将re.findall
与max
一起使用:
import re
max(re.findall('[a-zA-Z]+', 'ab24[AaBbCDExy0longest]'), key=len)
# 'AaBbCDExy'
max(re.findall('[a-zA-Z]+', 'a a a1234b|c|d '), key=len)
# 'a'
考虑没有匹配的情况的小技巧:
max(re.findall('[a-zA-Z]+', '12345 ') or [''], key=len)
# ''
尽管我建议您采用更具可读性的方法:
r = re.findall('[a-zA-Z]+', '12345 ')
if r:
out = max(r, key=len)
else:
out = ''
或者正如@deepstop对条件表达式的建议:
out = max(r, key=len) if r else ''
像yatu一样,我对这样一个问题的第一个想法是正则表达式。然而,我根据您的方法提供了一个解决方案。您代码中的问题是,当字符是alpha时,您只增加I。因此对于字符串abc123
您将增加I 3倍。但由于下一个字符不是alpha,您不会增加I。这意味着I是now的值为3,这小于字符串6的长度。因此,由于停止增加i,函数将陷入无限循环
代码的简化版本可以如下所示编写。基本上不需要第二个while循环。实际上根本不需要while循环,您可以使用for循环迭代字符串中的每个字符
def longestSubstring(string):
longest_letterSeq = ''
curr_letterSeq = ''
for char in string:
if char.isalpha():
curr_letterSeq += char
else:
if len(curr_letterSeq) > len(longest_letterSeq):
longest_letterSeq = curr_letterSeq
curr_letterSeq = ''
return longest_letterSeq
my_strings = ['ab24[AaBbCDExy0longest]', 'a a a1234b|c|d ', '12345']
for string in my_strings:
longest = longestSubstring(string)
print(f'the longest string in "{string}" is "{longest}"')
输出
the longest string in "ab24[AaBbCDExy0longest]" is "AaBbCDExy"
the longest string in "a a a1234b|c|d " is "a"
the longest string in "12345" is ""
像yatu一样,我对这样一个问题的第一个想法是正则表达式。然而,我根据您的方法提供了一个解决方案。您代码中的问题是,当字符是alpha时,您只增加I。因此对于字符串abc123
您将增加I 3倍。但由于下一个字符不是alpha,您不会增加I。这意味着I是now的值为3,这小于字符串6的长度。因此,由于停止增加i,函数将陷入无限循环
代码的简化版本可以如下所示编写。基本上不需要第二个while循环。实际上根本不需要while循环,您可以使用for循环迭代字符串中的每个字符
def longestSubstring(string):
longest_letterSeq = ''
curr_letterSeq = ''
for char in string:
if char.isalpha():
curr_letterSeq += char
else:
if len(curr_letterSeq) > len(longest_letterSeq):
longest_letterSeq = curr_letterSeq
curr_letterSeq = ''
return longest_letterSeq
my_strings = ['ab24[AaBbCDExy0longest]', 'a a a1234b|c|d ', '12345']
for string in my_strings:
longest = longestSubstring(string)
print(f'the longest string in "{string}" is "{longest}"')
输出
the longest string in "ab24[AaBbCDExy0longest]" is "AaBbCDExy"
the longest string in "a a a1234b|c|d " is "a"
the longest string in "12345" is ""
另一种方法是用空格替换所有非字母,拆分,然后选择最长的字符串
import re
def func(s) :
l = re.sub('[^a-zA-Z]+', ' ', s).split()
l.append('') # Append an empty string so the list is bound not to be empty.
return max(l, key=len)
func('ab24[AaBbCDExy0longest]')
func('foo2bar')
func('')
另一种方法是用空格替换所有非字母,拆分,然后选择最长的字符串
import re
def func(s) :
l = re.sub('[^a-zA-Z]+', ' ', s).split()
l.append('') # Append an empty string so the list is bound not to be empty.
return max(l, key=len)
func('ab24[AaBbCDExy0longest]')
func('foo2bar')
func('')
最后一个例子的第三行应该是key=len
,或者如果r为“”,则应该是out=max(r,key=len)
Yes@Deepstop。Yes只是想为OP增加一个可读性。无论如何,谢谢,让我们把它添加到tunp中。我也这么想。应该是key=len
在最后一个例子的第三行,或者是out=max(r,key=len)如果r else“”
是的,谢谢@Deepstop。是的,我只是想为OP找一个更可读的版本。无论如何,谢谢,让我们把它添加到tunp中。我也这么想。