题目1
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
思路
1. 输入“多个单词组成的字符串,并以空格分割”
2. 如何对最后一个单词进行定位?
len() 不仅可以求单个单词的长度,还可以求列表里面的元素(单词)的长度,进而做到对最后一个单词的定位。
解答
str = input()
list = str.split(' ') # 以空格分割字符串并将结果存入列表list
n = len(list) - 1 # 获取列表list最后一个元素的索引
print(len(list[n]))
tips:
1.split()
函数返回的是列表(list
)类型,而不是数组(array
)类型。默认以空白(空格、换行等)为分隔符。
2. 列表(list
)是一个动态数组,可以包含不同类型的元素,并且大小是可变的。
数组(通常array
创建)主要用于存储相同类型的元素(如整数、浮点数等),并且其大小在创建后是固定的。
扩展
https://zhuanlan.zhihu.com/p/629416216 【Python】实例10:文本词频统计
题目2
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
思路
1. 别迷惑“标点不倒置”,正常split(' ')下来,标点跟在单词后面(无空格),就算一个元素。
2. split()分割字符串里的单词,存储为一个列表后,反转操作有两个常用方法。主要区分在是否改变原列表。
解答
方法一:直接用函数
str =input()
list = str.split(' ')
list.reverse() # 如果交换变量,打印出现None。因为函数reverse会直接在原列表上修改。
print(list)
print(' '.join(list)) # 如果直接打印list,结果是列表形式,需要.join()输出
tips:
1. 使用reverse()函数时,改变的是原列表。
2. 题目要求打印出来是的格式,不是列表,所以用空格去join() 进行输出。
方法二:用切片[::-1]
str = input()
list = str.split()
new = list[::-1] # 不split会将单词里面的字母都转置
print(' '.join(new)) # 同样join将列表输出
题目3
读入一个字符串str,输出字符串str中的连续最长的数字串。
示例 abcd12345ed125ss123456789 ,输出必须 123456789 (数字串)
思路
1. 看清题目,以下是不完善的尝试记录:
a. 非求最长字符串的长度
str = input() # 最长字符串的长度
list = str.split(' ')
ls=[]
for i in list:
len(i)
ls.append(len(i))
print(max(ls))
b. 假设已经分开,求最长的字符串。
words = ['abc', '12345', '123', 'abcdefj']
# 初始化2个变量:一个用于存储最长字符串的长度,另外一个存储最长字符串
max_length = 0
longest_word = '' # 定义初始的字符串的方法
# 如果当前字符串的长度大于已知的最长长度
for word in words:
if len(word) > max_length:
# 更新最长长度和最长字符串
max_length = len(word)
longest_word = word
print(longest_word)
2. 问题:怎么把字母和数字分开?怎么做到取出的是数字串?最后怎么融合?
.isalpha() 检查字符串中的所有字符是否都是字母(包括大小写),且字符串中至少含一个字符。Python 3 里中文字符也被视为字母字符,返回True/False。
.isalnum() 检查字符串中的所有字符是否都是字母(包括大小写)或数字,且字符串中所有的字符都是字母或数字,且字符串至少含一个字符,返回True/False。
.isdigit() 检查字符串中所有字符是否都是数字,返回True/False。但在处理包含负号、千位分隔符不够用。
def split_number_and_non_number(s):
result = [] # 注意result和current_word的不同
current_word = '' # 用于累积当前的数字串,有清空操作
preceding_is_number = False
longest_word = ''
for char in s:
if char.isdigit():
if not preceding_is_number:
# 如果前一个字符不是数字,并且结果不是空的,则添加空格
if result and not result[-1].isdigit():
result.append(' ')
preceding_is_number = True # 设置标志变量为True
current_word += char # 累积当前数字
# 更新最长数字串
if len(current_word) > len(longest_word): # 因为是数字,也可以直接比大小
longest_word = current_word
else:
if preceding_is_number:
# 如果前一个字符是数字,则添加当前数字字符串和空格到结果中
result.append(current_word)
result.append(' ')
preceding_is_number = False
current_word = '' # 重置当前数字字符串 本来为12345
result.append(char)
# 如果字符串以数字结尾,确保将其添加到结果中
if preceding_is_number:
result.append(current_word)
return ''.join(result), longest_word
# 示例输入
input_string = input() # 有负号就不行了
# 调用函数并打印结果
output_string, longest_word = split_number_and_non_number(input_string)
print(output_string) # 输出: bc.d. 12345 .ed 125 e
print(longest_word)
将代码合并,做到将非数字的字符串和数字字符串且分开输出,并在循环的第一个大条件里面,直接对累积出来的 current_word 与 longest_word 的长度,进行比较判断(即先将数字和非数字字符串分开,在数字部分直接判断谁最长)。
缺点是数字是一个一个进行比较的,而不是一串一串进行的。修改后,会遗漏最后一个数字串。需要补充上。
def split_number_and_non_number(s):
result = [] # 注意result和current_word的不同
current_word = '' # 用于累积当前的数字串,有清空操作
preceding_is_number = False
longest_word = ''
for char in s:
if char.isdigit():
if not preceding_is_number:
# 如果前一个字符不是数字,并且结果不是空的,则添加空格
if result and not result[-1].isdigit():
result.append(' ')
preceding_is_number = True # 设置标志变量为True
current_word += char # 累积当前数字
else:
if preceding_is_number:
# 如果前一个字符是数字
# 则 1.添加当前数字字符串和空格到结果中 2.对数字串进行长短比较
result.append(current_word)
result.append(' ') #1
#2 更新最长数字串
if len(current_word) > len(longest_word):
longest_word = current_word
preceding_is_number = False
# 重置当前数字字符串
current_word = ''
result.append(char)
# 如果字符串以数字结尾,确保将其添加到结果中
if preceding_is_number:
result.append(current_word)
# 循环后才有最后一个数字串,但比较是在循环里面做的,这里补一次
if len(current_word) > len(longest_word):
longest_word = current_word
return ''.join(result), longest_word
# 示例输入
input_string = input() # 负号、浮点不行
output_string, longest_word = split_number_and_non_number(input_string)
print(output_string)
print(longest_word)
测试一些例子:bcd.12345.ed125e88 输出 bcd. 12345 .ed 125 e 88 但无法对负号进行操作。
解答
正则表达式
import re, bisect
w = re.findall(r'\d+', input())
n = list(map(int, w))
print(max(n))
另外一个,只拿数字串,其他整体分割的结果不需要管。
def long_num(str):
max_list = []
for i in range(len(str)):
new_list = []
for j in range(i+1,len(str)):
if str[j].isdigit():
new_list.append(str[j])
else:
break
if len(max_list) < len(new_list):
max_list = new_list
return ''.join(max_list)
str = input()
print(long_num(str))