1. 数据结构基本上就是——它们是可以处理一些 数据的结构。或者说,它们是用来存储一组相关数据的。
在Python中有三种内建的数据结构——列表、元组和字典。
2. 列表
列表是处理一组有序的数据结构。python中使用 ',' 将其分开
#! /apps/android/python2.6/bin/python
#Filename: using_list.py
shoplist = ['apple', 'carrot', 'banana', 'pee'] // 用[]告诉python这是一个列表
print 'I have ', len(shoplist), ' items to purchase'
print shoplist //也可以用 for item in shoplist: print item 这样的方式打印出来
print '\nI have to buy rice too.'
shoplist.append('rice') // append是列表类的方法
print 'Now, I have to buy ', shoplist
print '\nI have to sort the list'
shoplist.sort() // 同append方法
print 'After sort', shoplist
print '\nI have got the first item'
del shoplist[0] // del删除
print 'After del', shoplist
注:我们使用列表的sort
方法来对列表排序。需要理解的是,这个方法影响列表本身,而不是返回一个修改后的列表——这与字符串工作的方法不同。这就是我们所说的列表是 可变的 而字符串是 不可变的 。
3. 元组
元组和列表十分类似,只不过元组和字符串一样是 不可变的 即你不能修改元组。元组通过圆括号中用逗号分割的项目定义。元组通常用在使语句或用户定义的函数能够安全地采用一组值的时候,即被使用的元组的值不会改变!
zoo = ('wolf', 'elephant', 'penguin')
含有0个或1个项目的元组: 一个空的元组由一对空的圆括号组成,如myempty = ()
。然而,含有单个元素的元组就不那么简单了。你必须在第一个(唯一一个)项目后跟一个逗号,这样Python才能区分元组和表达式中一个带圆括号的对象。即如果你想要的是一个包含项目2
的元组的时候,你应该指明singleton = (2 , )
。
使用元组输出
#!/usr/bin/python
# Filename: print_tuple.py
age = 22
name = 'Swaroop'
print '%s is %d years old' % (name, age) //outputs: Swaroop is 22 years old
print 'Why is %s playing with that python?' % name //outputs: Why is Swaroop playing with that python?
4. 字典
字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情况)联系在一起。注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息。
注意,你只能使用不可变的对象(比如字符串)来作为字典的键,但是你可以不可变或可变的对象作为字典的值。基本说来就是,你应该只使用简单的对象作为键。
键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }
。注意它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。
字典中的键/值对是没有顺序的。如果你想要一个特定的顺序,那么你应该在使用前自己对它们排序。
#!/usr/bin/python
# Filename: using_dict.py
# 'ab' is short for 'a'ddress'b'ook
ab = { 'Swaroop' : 'swaroopch@byteofpython.info',
'Larry' : 'larry@wall.org',
'Matsumoto' : 'matz@ruby-lang.org',
'Spammer' : 'spammer@hotmail.com'
}
print "Swaroop's address is %s" % ab['Swaroop']
# Adding a key/value pair
ab['Guido'] = 'guido@python.org'
# Deleting a key/value pair
del ab['Spammer']
print '\nThere are %d contacts in the address-book\n' % len(ab)
for name, address in ab.items(): //一行被字典视为一个元素
print 'Contact %s at %s' % (name, address)
if 'Guido' in ab: # OR ab.has_key('Guido')
print "\nGuido's address is %s" % ab['Guido']
5. 序列
列表,元组,字典都共享序列中的索引和切片操作
索引:
python是从0开始计数
索引同样可以是负数,在那样的情况下,位置是从序列尾开始计算的。因此,shoplist[-1]
表示序列的最后一个元素而shoplist[-2]
抓取序列的倒数第二个项目。
切片:
切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割。注意这与你使用的索引操作符十分相似。记住数是可选的,而冒号是必须的。
切片操作符中的第一个数(冒号之前)表示切片开始的位置,第二个数(冒号之后)表示切片到哪里结束。如果不指定第一个数,Python就从序列首开始。如果没有指定第二个数,则Python会停止在序列尾。注意,返回的序列从开始位置 开始 ,刚好在 结束 位置之前结束。即开始位置是包含在序列切片中的,而结束位置被排斥在切片外。
这样,shoplist[1:3]
返回从位置1开始,包括位置2,但是停止在位置3的一个序列切片,因此返回一个含有两个项目的切片。类似地,shoplist[:]
返回整个序列的拷贝。
你可以用负数做切片。负数用在从序列尾开始计算的位置。例如,shoplist[:-1]
会返回除了最后一个项目外包含所有项目的序列切片。
6. 更多的字符串操作
#!/usr/bin/python
# Filename: str_methods.py
name = 'Swaroop' # This is a string object
if name.startswith('Swa'):
print 'Yes, the string starts with "Swa"' //outputs: yes ....
if 'a' in name:
print 'Yes, it contains the string "a"' //outputs: yes ....
if name.find('war') != -1:
print 'Yes, it contains the string "war"' //outputs: yes ...
delimiter = '_*_'
mylist = ['Brazil', 'Russia', 'India', 'China']
print delimiter.join(mylist) //outputs: Brazil_*_Russia_*_India_*_China
startwith
方法是用来测试字符串是否以给定字符串开始。
in
操作符用来检验一个给定字符串是否为另一个字符串的一部分。
find
方法用来找出给定字符串在另一个字符串中的位置,或者返回-1以表示找不到子字符串。
str
类也有以一个作为分隔符的字符串join
序列的项目的整洁的方法,它返回一个生成的大字符