三、字符串的操作
3.1基本字符串操作
基本字符串操作
所有标准序列的操作(索引、分片、乘法、判断成员资格、求长度、取最小值和最大值)对字符串同样适用。唯一不同是字符都是不可变的
3.2字符串格式化:精简版 字符串格式化使用字符串格式化操作符即百分号%来实现
示例如下:
>>> format = "hello,%s,%s enough for ya?"
>>> values = ('World','Hot')
>>> print format % values
hello,World,Hot enough for ya?
>>> format = "Pi with three decimals:%.3f"#格式化浮点数
>>> from math import pi
>>> print format % pi
Pi with three decimals:3.142
3.3字符串格式化:完整版
示例:
>>> '%s plus %s equals %s' %(1,1,2)
'1 plus 1 equals 2'
>>> #如果需要转换的元组作为转换表达式的一部分存在,那么必须将它用圆括号括起来,以避免出错
3.3.1简单转换
简单的转换只需要写出转换类型,使用起来很简单
>>> from math import pi
>>> 'Pi:%f...' % pi
'Pi:3.141593...'
3.3.2字符宽度和精度
>>> '%10f' % pi #字段宽10
' 3.141593'
>>> '%10.2f' % pi #字段宽10,精度2
' 3.14'
>>> '%.2f' % pi #精度2
'3.14'
>>> '%.5s' % 'Guido van Rossum'
'Guido'
3.3.3 符号、对齐和用0填充
>>> '%010.2f' % pi
'0000003.14'
>>> print ('% 5d' % 10) + '\n' + ('% 5d' % -10)
10
-10
>>> #而空白意味着在正数前加上空格。这在需要对齐正负数时会很有用
>>> print ('%+5d' % 10) + '\n' + ('%+5d' % -10)
+10
-10
>>> #加号,它表示不管是正数还是负数都标示出符号(同样是在对齐时很有用)
3-1 字符串格式化示例
#使用给定的宽度打印格式化之后的价格列表
width = input('Please enter width: ')
price_width = 10
item_width = width - price_width
header_format = '%-*s%*s'
format = '%-*s%*.2f'
print '=' * width
print header_format % (item_width, 'Item', price_width, 'Prce')
print '-' * width
print format % (item_width, 'Apples',price_width,0.4)
print format % (item_width, 'Pears',price_width,0.5)
print format % (item_width, 'Cantaloupes',price_width,1.92)
print format % (item_width, 'Dried Apricots(16 oz.)',price_width,8)
print format % (item_width, 'Prunes(4 lbs.)',price_width,12)
运行效果
Please enter width: 35
===================================
Item Prce
-----------------------------------
Apples 0.40
Pears 0.50
Cantaloupes 1.92
Dried Apricots(16 oz.) 8.00
Prunes(4 lbs.) 12.00
3.4字符串方法
3.4.1 find
find方法可以在一个较长的字符串中查找子串。它返回子串所在位置的最左端索引。如果没有找到则返回-1
>>> title = "Monty Python's Flying Circus"
>>> title.find('Monty')
0
>>> title.find('Python')
6
>>> title.find('Flying')
15
3.4.2 join
>>> seq = ['1','2','3','4','5']
>>> sep = '+'
>>> sep.join(seq)
'1+2+3+4+5'
>>> dirs = '','usr','bin','env'
>>> '/'.join(dirs)
'/usr/bin/env'
3.4.3 lower
lower方法返回字符串的小写字母版
>>> 'Trondheim Hammer Dance'.lower()
'trondheim hammer dance'
3.4.4 replace
>>> 'This is a test'.replace('is','eez')
'Theez eez a test'
3.4.5 split
>>> '1+2+3+4+5'.split('+')
['1', '2', '3', '4', '5']
3.4.6 strip
strip方法返回去除两侧(不包括内部)空格的字符串
>>> name = ' Nick Feng '
>>> name.strip()
'Nick Feng'
3.4.7 translate
translate方法和replace方p一样,可以替换字符串的某些部分,但和前者不同的是translate只处理单个字符,它的优势在于同时进行多个替换,有时候比replace要效率高!
下面是个很简单的例子:假设需要将纯正英文文本转换为带有德国口音版本的,需要把字符 c 替换为 k 把 s 替换成 z
>>>import string
>>>table = string.strmaketrans('cs','kz')
>>>"this is a test".translate(table)
'thiz iz a tezt'
四、字典详解
通过键引用值的数据结构叫映射,字典是Python中唯一的自建映射类型。
字典的使用
>>> phonebook['Cecil']
3518
创建和使用字典
通过如下方式可以直接创建字典:
>>> phonebook = {'Alice':'2301', 'Beth':'9012','Cecil':'3258'}
dict函数
可以通过dict函数创建字典,如下是两种创建方式:
>>> items = [('name', 'Gubby'), ('age', 42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gubby'}
>>> items = [('name', 'Gubby'), ('age', 42)]
>>> d= dict(name='Gubby', age=42)
>>> d
{'age': 42, 'name': 'Gubby'}
基本字典操作
字典行为跟序列很类似:
- len(d) 返回字典中键值对的数量。
- d[k] 返回关联到键k的值。
- d[k] = v 将v值映射到k上。
- del d[k] 删除键为k的项。
- k in d 检查d中是否有键为k的项目。
但又有一些重要的差别:
- 键类型 不一定是整数类型,也可能是其他不可变类型。
- 自动添加 键最初是不存在的,为它分配以后才有。
- 成员资格 kind查找键,vinl查找值。
#键的类型:字典的键可以是整型,浮点型(实型),字符串或元组. 字典的键可以是任何不可变类型.
#在字典中检查键的成员资格比在列表中检查值的成员资格更有效,数据结构的规模越大,两者的效率差距越明显
本书给出了一个电话本的例子程序,输入输出结果如下图所示,当做练习稍微思考下如果自己实现会如何做:
代码:
people = {
'Alice': {
'phone': '2341',
'addr': 'Foo drive 23'
},
'Beth': {
'phone': '9102',
'addr': 'Bar street 42'
},
'Cecil': {
'phone': '3158',
'addr': 'Baz avenue 90'
}
}
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = raw_input("What's your name?")
request = raw_input("Phone(p) number or address(a)?")
if request == 'p':
key = 'phone'
if request == 'a':
key = 'address'
if(name in people):
print "%s's %s is %s" % (name, key, people[name][key])
运行结果
用字典来格式化字符串
如下例,出了增加括号括起来的键以外,其他部分还是一样的工作:
>>> phonebook = {'Alice': '2341'}
>>> print "Alice's phone is: %(Alice)s" % phonebook
Alice's phone is: 2341
注意:这类字符串格式户在模板中使用非常多。
字典方法
- clear() :清除字典中的所有项
如果可以通过将字典直接指向 {},为什么还会需要clear方法呢,如下的例子也许能够说明原因:
>>> x = {}
>>> y = x
>>> x['name'] = 'Joey'
>>> y
{'name': 'Joey'}
>>> x = {}
>>> y
{'name': 'Joey'}
>>> x.clear()
>>> y
{}
如果有过编程经验对于上述代码中,使用x={}和x.clear()的差别应该容易理解。否则,一定要花些时间理解下指针 或 对象引用值引用的概念。
- copy() :返回一个具有相同键值对的新字典。
该方法实现的是浅复制,要理解如下例子还是要看上述所提到的对象引用和值引用的差别:
>>> x = {'usrename':'admin', 'machines': ['foo', 'bar', 'haz']}
>>> y = x.copy()
>>> y['username'] = 'root'
>>> y['machines'][1] = 'par'
>>> x
{'usrename': 'admin', 'machines': ['foo', 'par', 'haz']}
>>> y
{'username': 'root', 'usrename': 'admin', 'machines': ['foo', 'par', 'haz']}
要实现深复制,要通过from copy import deepcopy来引入deepcopy方法。
- fromkeys() ,使用给定的键,建立新的字典。
可以通过所给定的键来建立字典,当然你也可以通过给定第二个参数来指定默认值:
>>> {}.fromkeys(['name', 'age'])
{'age': None, 'name': None}
>>> {}.fromkeys(['name', 'age'], 'unknow')
{'age': 'unknow', 'name': 'unknow'}
- get() 访问字典的方法,访问字典中不存在的项时,不会报错会返回:“none”,并且可以自定义“默认值” none。
代码区
>>> d={}
>>> print d['name']
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
print d['name']
KeyError: 'name'
>>> print d.get['name']
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
print d.get['name']
TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'
>>> print d.get('name')
None
>>> d.get('name','N/A')
'N/A'
>>> d['name']='Eric'
>>> d.get('name')
'Eric'
- has_key() :可以检查字典中是否含有特定键
>>> d={}
>>> d.has_key('name')
False
>>> d['name']='Eric'
>>> d.has_key('name')
True
- items和iteritems 将字典中所有的项以列表方式返回!
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.items()
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
>>> it = d.iteritems()
>>> it
<dictionary-itemiterator object at 0x1005dbc00>
>>> list(it)
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
- keys和iterkeys 将字典中的键以列表形式返回、而iterkeys则返回针对键的迭代器。
>>> keys = d.keys()
['url', 'spam', 'title']
>>> it = d.iterkeys()
>>> list(it)
['url', 'spam', 'title']
- pop() 用于获得给定键的值,然后将这个键值对从字典中移除。
>>> d = {'one':1, 'two': 2}
>>> d.pop('one')
1>>> d
{'two': 2}
- popitem() 类似于list.pop,后者会弹出列表的最后一个元素,但不同的是popitem弹出的是随即项,因为字典中没有:“最后的元素” 和顺序的概念!因为字典是无序的,类似于append方法是没有任何意义的!
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.popitem()
('url', 'http://www.python.org')
>>> d
{'spam': 0, 'title': 'Python Web Site'}
- setdefault()
setdefault相比较之前的get方法是很类似的,差别呢其实从名字上也能区分出来,一个是改变了获取到的结果,一个是改变了字典的内容然后才去获取字典的值:
>>> d = {}
>>> d.setdefault('name', 'N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'goddy'
>>> d
{'name': 'goddy'}
- update()
update方法可以利用一个字典来更新另外一个字典的内容。
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> x = {'title': 'Python Langulage'}
>>> d.update(x)
>>> d
{'url': 'http://www.python.org', 'spam': 0, 'title': 'Python Langulage'}
- values和itervalues()
values方法以列表的形式返回字典的值(itervalues 返回值的迭代器),与返回键不同的是,返回值的列表可以包含重复的元素。
>>>d = {'one':1, 'two': 2, 'three': 2}
>>>d.values()
[2, 2,1]