您的位置:首页 > 理论基础 > 数据结构算法

Python数据结构:序列——字符串

2015-06-24 20:45 776 查看
字符串属于序列(sequence),所以序列的相关操作都适用于字符串。字符串不可以被改变,使用某些函数的时候他会返回一个新的值,而不是改变原字符串

此外还有一些字符串特有的属性:

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 s
replace() 函数并不会改变 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,统计单词的总值。

最后需要的就是跟上题一致的解决输入方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: