Python数据结构:序列——字符串
2015-06-24 20:45
776 查看
字符串属于序列(sequence),所以序列的相关操作都适用于字符串。字符串不可以被改变,使用某些函数的时候他会返回一个新的值,而不是改变原字符串
此外还有一些字符串特有的属性:
1. 字符串格式化 %——格式化字符串 % 需要放到格式化字符串的值
%s, %.3f, %c 都是conversion specifier 转换说明符,标记了需要插入values 的位置,限定字段宽时保留的最小最小最小字符串个数(不够补足,够了不会砍掉)
实际应用:(缺陷是如果输入的值比较小,那么肯能会出现对不齐的现象)
2. find 方法找到首字母索引并返回——不改变原字符串
3. join (与 split 相反)
所以来看看split() 吧
4.replace——替代找到的所有目的字符串,并返回——不改变原字符串
5. strip() 无参数去空
6. translate() 方法需要 maketrans() 函数的帮助
相比 replace 只能一次替换一个单位,这个可以一次替换多个单位
下面的题目大多采用的是直接思考,并没有使用String的一些强大的属性以及他的一些built-in函数。
解题方法一般基于对String还属于一般了解的程度。
都知道String中的 + 是结合两个String对象
那么 - 呢?对数字适用,对String来说就不可用了,Traceback!!!!!
关于字符串函数:
replace() 先来看一段代码:
1. String下标:字符串s长度为奇数,则显示中间字符的表达式为?
解:
分析:实际上这个题目的考点是很简单的,就是index是从0开始,同时运用了一个技巧就是int直接除留整
引申一下:字符串s长度为偶数,显示前半段字符串的表达式为?
解:
按照0 ~ len(s) 可以知道,要偶数前半的计算方式是:len(s) / 2 - 1 得到前半部分最后一个一个数字的下标,然而,字符串的split 冒号后面的 index 是up to but not including(到但是不包括)的,所以需要 + 1
2. “Pig Latin”是一个英语儿童文字改写游戏,整个游戏遵从下述规则:
(1). 元音字母是‘a’、‘e’、‘i’、‘o’、‘u’。字母‘y’在不是第一个字母的情况下,也被视作元音字母。其他字母均为辅音字母。例如,单词“yearly”有三个元音字母(分别为‘e’、‘a’和最后一个‘y’)和三个辅音字母(第一个‘y’、‘r’和‘l’)。
(2). 如果英文单词以元音字母开始,则在单词末尾加入“hay”后得到“Pig Latin”对应单词。例如,“ask”变为“askhay”,“use”变为“usehay”。
(3). 如果英文单词以‘q’字母开始,并且后面有个字母‘u’,将“qu”移动到单词末尾加入“ay”后得到“Pig Latin”对应单词。例如,“quiet”变为“ietquay”,“quay”变为“ayquay”。
(4). 如果英文单词以辅音字母开始,所有连续的辅音字母一起移动到单词末尾加入“ay”后得到“Pig Latin”对应单词。例如,“tomato”变为“omatotay”, “school” 变为“oolschay”,“you” 变为“ouyay”,“my” 变为“ymay ”,“ssssh” 变为“sssshay”。
(5). 如果英文单词中有大写字母,必须所有字母均转换为小写。
输入格式:
一系列单词,单词之间使用空格分隔。
输出格式:
按照以上规则转化每个单词,单词之间使用空格分隔。
输入样例:
Welcome to the Python world Are you ready
输出样例:
elcomeway otay ethay ythonpay orldway arehay ouyay eadyray
解:
这道题目文字比较多,但是实际上不是很难,分两个部分解决:转换单词部分,拆分句子到单词部分(此前暂时没有考虑使用String内置的powerful的函数,纯粹的思考可以帮助提高)。
着重看到两个大的条件——以元音字母开头,以辅音字母开头,而英语中,非元音即为辅音,使用two-way(if-else)
而辅音之中又存在着几种情况,同时还要注意特殊的“y”。
其中有一些细节需要处理,那就是字符串的前移后添。
3. 依次判断一系列给定的字符串是否为合法的 Python 标识符。
输入格式:
一系列字符串,每个字符串占一行。
输出格式:
判断每行字符串是否为合法的 Python 标示符,如果合法则输出 True,否则输出 False。
输入样例:
abc
_def
21gh
输出样例:
True
True
False
解:
最后还是要提醒下,tab键真的不要随便使用,有时候会看见这样的Error:
IndentationError:unindent does not match any outer indentation level
这个时候就考虑将对应的缩进重新使用space键进行缩进。(情况多出现在多行缩进的时候,单独的一行缩进一般很少发现这样的Error)
5. 题目内容:
依次计算一系列给定字符串的字母值,字母值为字符串中每个字母对应的编号值(A对应1,B对应2,以此类推,不区分大小写字母,非字母字符对应的值为0)的总和。例如,Colin 的字母值为 3 + 15 + 12 + 9 + 14 = 53
输入格式:
一系列字符串,每个字符串占一行。
输出格式:
计算并输出每行字符串的字母值。
输入样例:
Colin
ABC
输出样例:
53
6
解:
首先建立一个list 按顺序存放字母,以便后期遍历得到字母的编号值。
建立两个函数分别用来找到字母的num,统计单词的总值。
最后需要的就是跟上题一致的解决输入方法。
此外还有一些字符串特有的属性:
1. 字符串格式化 %——格式化字符串 % 需要放到格式化字符串的值
%s, %.3f, %c 都是conversion specifier 转换说明符,标记了需要插入values 的位置,限定字段宽时保留的最小最小最小字符串个数(不够补足,够了不会砍掉)
format = 'Hello, %s. %s dollar enough for ya' # %s : #values should be map(dict) or tuple,other type will be only one value not two or more values values = ('world',59) value_list = ['world',59] # list represent only on value values_nopar = 1, 59 # it's tuple but no parentheses may cause error print format,values print format % values #print format % value_list # list just represent one values print format % values_nopar # parentheses is better in case error cause format = 'Now the process is:%.3f %%' # %% represent % format0 = 'Now the process is:%15.3f %%' # %% represent % format00 = 'Now the process is:%1.3f %%' # %% represent % from math import pi print format0 % (pi *1000),'\n', format00 % (pi *1000) print 'Using str: %s' % 42L print 'Using repr: %r' % 42L print 'This is hexadecimal %x' % 42 print ('%5d' % 10 ),'\n',('%5d' % -10) print '%-10.2f' % pi print '%010.2f' % pi # not oct number格式化字符串 这部分据观察,基本上是字符串格式,所以要加上引号——'格式化字符串' / "格式化字符串"
实际应用:(缺陷是如果输入的值比较小,那么肯能会出现对不齐的现象)
width = input('Please enter width:') price_width = 10 item_width = width - price_width header_format = '%-*s%*s'#- represent left justifying format = '%-*s$*.2f' print '=' * width print header_format % (item_width,'Item',price_width, 'Price') print header_format % (item_width,'Pears',price_width, 0.5) print header_format % (item_width,'cantaloupes',price_width, 1.92) print header_format % (item_width,'Dried Apricots (16 oz.)',price_width, 8)
2. find 方法找到首字母索引并返回——不改变原字符串
subject = '$$$ Get rich now!! $$$' print subject.find('$$$') print subject.find('$$$',3) #from index 3 to start print subject.find('$',21,23) # find $ in section (22-21)
3. join (与 split 相反)
seq = ['1','2','3','4','5'] con = '+' print con.join(seq) seq = [1,2,3,4,5] #sequence must be made by string!! con = '+' print con.join(seq)
所以来看看split() 吧
seq = ['1','2','3','4','5'] con = '+' result = con.join(seq) print result print result.split(con)
4.replace——替代找到的所有目的字符串,并返回——不改变原字符串
print 'hahaha'.replace('ha','55') print 'It is good, it is happy'.replace('is','was')
5. strip() 无参数去空
str0 = '!!!***hahah***!!!' str1 = 'test ' print str0.strip('*!'),str1.strip()left 去空——lstrip,right 去空——rstrip
6. translate() 方法需要 maketrans() 函数的帮助
<pre name="code" class="python">from string import maketrans table = maketrans('cs','kz') print len(table),table[97:123] str0 = 'this is increadible test' print str0.translate(table) print str0.translate(table,'t') #delete 't' in str0, 2nd parameter
相比 replace 只能一次替换一个单位,这个可以一次替换多个单位
练习题
* reference & inspiration:网易云课程第五周下面的题目大多采用的是直接思考,并没有使用String的一些强大的属性以及他的一些built-in函数。
解题方法一般基于对String还属于一般了解的程度。
都知道String中的 + 是结合两个String对象
那么 - 呢?对数字适用,对String来说就不可用了,Traceback!!!!!
关于字符串函数:
replace() 先来看一段代码:
s = 'Hello World' print s.replace('o','b') print sreplace() 函数并不会改变 s (尽管是通过“ . ”来调用函数),所以如果想要replace() 改变的字符串的值,还需要另外将值赋值给变量。
1. String下标:字符串s长度为奇数,则显示中间字符的表达式为?
解:
s[len(s)/2]
分析:实际上这个题目的考点是很简单的,就是index是从0开始,同时运用了一个技巧就是int直接除留整
引申一下:字符串s长度为偶数,显示前半段字符串的表达式为?
解:
s = 'abcd' print s[ :len(s) / 2 ] print s[ 0:len(s) / 2 ]分析:两个考点—— 字符串的split ,index下标从零开始
按照0 ~ len(s) 可以知道,要偶数前半的计算方式是:len(s) / 2 - 1 得到前半部分最后一个一个数字的下标,然而,字符串的split 冒号后面的 index 是up to but not including(到但是不包括)的,所以需要 + 1
2. “Pig Latin”是一个英语儿童文字改写游戏,整个游戏遵从下述规则:
(1). 元音字母是‘a’、‘e’、‘i’、‘o’、‘u’。字母‘y’在不是第一个字母的情况下,也被视作元音字母。其他字母均为辅音字母。例如,单词“yearly”有三个元音字母(分别为‘e’、‘a’和最后一个‘y’)和三个辅音字母(第一个‘y’、‘r’和‘l’)。
(2). 如果英文单词以元音字母开始,则在单词末尾加入“hay”后得到“Pig Latin”对应单词。例如,“ask”变为“askhay”,“use”变为“usehay”。
(3). 如果英文单词以‘q’字母开始,并且后面有个字母‘u’,将“qu”移动到单词末尾加入“ay”后得到“Pig Latin”对应单词。例如,“quiet”变为“ietquay”,“quay”变为“ayquay”。
(4). 如果英文单词以辅音字母开始,所有连续的辅音字母一起移动到单词末尾加入“ay”后得到“Pig Latin”对应单词。例如,“tomato”变为“omatotay”, “school” 变为“oolschay”,“you” 变为“ouyay”,“my” 变为“ymay ”,“ssssh” 变为“sssshay”。
(5). 如果英文单词中有大写字母,必须所有字母均转换为小写。
输入格式:
一系列单词,单词之间使用空格分隔。
输出格式:
按照以上规则转化每个单词,单词之间使用空格分隔。
输入样例:
Welcome to the Python world Are you ready
输出样例:
elcomeway otay ethay ythonpay orldway arehay ouyay eadyray
解:
这道题目文字比较多,但是实际上不是很难,分两个部分解决:转换单词部分,拆分句子到单词部分(此前暂时没有考虑使用String内置的powerful的函数,纯粹的思考可以帮助提高)。
着重看到两个大的条件——以元音字母开头,以辅音字母开头,而英语中,非元音即为辅音,使用two-way(if-else)
而辅音之中又存在着几种情况,同时还要注意特殊的“y”。
其中有一些细节需要处理,那就是字符串的前移后添。
def wordChan(str): temp = '' str0 = '' str = str.lower() if ( str[0] in ['a', 'e', 'i', 'o', 'u'] ): str += 'hay' else: if( str[0]=='q' and str[1] == 'u' ): if( len(str) == 2 ): str += 'ay' else: #need forward two letter for i in range ( 0,len(str)-2 ): #for i in range (0,len(str)-1 )--> mistake str0 += str[i+2] #can't alter String directly #str = str[0, len-2] str0 += 'quay' str = str0 else: for i in range( 0,len(str) ): index = i if (str[i] in ['a', 'e', 'i', 'o', 'u','y'] and str[0] != 'y'): break temp += str[i] for i in range( index, len(str) ): str0 += str[i] str0 += temp str0 += 'ay' str = str0 #or use: str0 += str[index, len(str)] return str str = raw_input("Enter here:") sPara = '' temp0 = '' i = 0 j = 0 #for i in range (0, len(str) ): while i < len(str): temp0 += str[i] if(str[i] == ' ' ): #sPara += wordChan(temp0[0, i]) string indices must be integers not tuple #temp0 = temp0[j:i] #???IndexError: string index out of range temp0 = str[j:i] #print 'str[i-1]:', str[i-1], 'str[j]:', str[j] #print 'j=', j,'i=',i sPara += wordChan(temp0)#use function can help a lot sPara += ' ' temp0 = '' j = i+1 i += 1 #forget this line cause pro dead sPara += wordChan(temp0) print sPara
3. 依次判断一系列给定的字符串是否为合法的 Python 标识符。
输入格式:
一系列字符串,每个字符串占一行。
输出格式:
判断每行字符串是否为合法的 Python 标示符,如果合法则输出 True,否则输出 False。
输入样例:
abc
_def
21gh
输出样例:
True
True
False
解:
str0 = '' def isLegal(str): if(str[0] == '_' or str[0].isalpha() ): # Judge first character for i in range(0, len(str) ): if(str[i].isalpha() or str[i].isdigit or str[i]=='_'): return 'True' else: return 'False' else: return 'False' str = raw_input("Enter:") while str != 'quit': str0 += isLegal(str) str0 += '\n' str = raw_input("Enter: ") #str0 += isLegal(str) this position is not right #str0 += '\n' print str0这道题还是偷了很多懒,代码也并不是很健壮,首先题目要求的先输入数据之后再隔行打印判断结果,那么就直接在一个字符串内持续添加——会添加跳行,会添加结果。
最后还是要提醒下,tab键真的不要随便使用,有时候会看见这样的Error:
IndentationError:unindent does not match any outer indentation level
这个时候就考虑将对应的缩进重新使用space键进行缩进。(情况多出现在多行缩进的时候,单独的一行缩进一般很少发现这样的Error)
5. 题目内容:
依次计算一系列给定字符串的字母值,字母值为字符串中每个字母对应的编号值(A对应1,B对应2,以此类推,不区分大小写字母,非字母字符对应的值为0)的总和。例如,Colin 的字母值为 3 + 15 + 12 + 9 + 14 = 53
输入格式:
一系列字符串,每个字符串占一行。
输出格式:
计算并输出每行字符串的字母值。
输入样例:
Colin
ABC
输出样例:
53
6
解:
def findNum(letter): index = 0 for i in letters: index = index + 1 if( letter == i): break return index def numSum(strs): strs = strs.lower() sum = 0 for j in strs: sum += findNum(j) return sum letters = ['a','b','c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] str0 = '' strs = raw_input("Enter str: ") while strs != 'quit': #num = numSum(strs) #str0 += str(num) str0 += str(numSum(strs)) str0 += '\n' strs = raw_input("Enter str: ") print str0
首先建立一个list 按顺序存放字母,以便后期遍历得到字母的编号值。
建立两个函数分别用来找到字母的num,统计单词的总值。
最后需要的就是跟上题一致的解决输入方法。
相关文章推荐
- 《数据结构与算法分析c++描述》读书笔记二——二叉树
- POJ 1655 Balancing Act (树的重心)
- 用数组实现js中的堆栈 或者队列数据结构
- 【数据结构】队列
- 数据结构基础(6)--递归和函数调用--汉诺塔问题C语言实现
- 【数据结构】栈
- 分析数据结构IO_CACHE及相关处理函数
- 【数据结构】线性表之链式存储结构
- 【数据结构】线性表之顺序存储结构
- C# 数据结构 栈 Stack
- 数据结构 - 图的数组存储
- 数据结构-堆
- 数据结构和算法经典100题-第19题
- 数据结构与算法(javascript描述)——2. 数组
- 平衡二叉树之一(基本性质、查询、添加)
- BZOJ3209 花神的嘲讽计划I
- 数据结构--图的定义和存储结构
- 2-06. 数列求和
- 【数据结构】直接插入排序_哨兵位
- 数据结构基础(5)--C语言实现循环队列--静态