列表、元组及通用序列操作

序列是Python中最基本的数据结构(一些基本特性类似于C++中的数组模板类),序列中的每一个元素都有相应的位置序号,从0开始。列表和元组属于序列,因此用于通用序列的操作都可以应用于它们,同时它们也有各自独特的方法。

通用序列操作

所有的序列类型都可以进行某些特定的操作,例如索引(indexing)、分片(slicing)、加(adding)、乘(multiplying)、迭代(iteration)、成员资格检查等。
索引(indexing)
序列中的所有元素都有对应的位置序号——从0开始递增。我们通过其对应序号访问某一个或某些元素的过程就是索引的过程。除了整数索引外,Python还提供了负数索引以更方便地访问序列元素。使用负数索引时,Python会从序列的右边,也就是最后一个元素开始计数,-1代表最后一个元素,-2代表倒数第二个元素,依此类推(没有-0)。
序列字面值能够直接使用索引,而不需要通过变量来访问。

如果一个函数调用返回一个序列,那么可以直接对返回结果(也就是序列)进行索引操作。

#!/usr/bin/env python
str1 = "Hello World!"
print str1[0]
print str1[-1]

print "Hello World!"[0]

str2 = raw_input("Please enter a string: ")[2]
print str2



分片(slicing)
分片操作可以用来访问序列中一定范围内的元素。分片操作通过一个冒号隔开的两个索引来实现,此时将访问包括第一个索引序号,不包括第二个索引序号的范围内的序列元素,也即左闭右开的半开区间。
Python的索引操作支持负数索引,因此也可以用负数索引方便地访问序列中排在末尾部分的元素。需要注意的是,由于分片的索引范围是左闭右开区间,因此如果需要访问最后一个元素时,需要置空第二个索引。同样如果要从第一个元素开始访问,也可以置空第一个索引(与0效果相同)。
在分片的时候,我们还可以设置第三个参数——步长,来满足我们的一些特殊需求。默认情况下步长参数的值为1,我们可以显式地设置它。

步长参数甚至支持负数,如果步长为负数,分片操作将会从右往左提取序列元素,使用负数步长时第一个索引序号必须大于第二个索引序号,否则分片结果会为空。对于负数步长,分片操作依然按照左闭右开区间来提取序列元素。

#!/usr/bin/env python
str = "Hello, world!"
print str[0:3]
num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print num[1:6]
print num[-3:-1]
print num[-3:]
print num[:3]
print num[:]
print num[0:8:2]
print num[8:0:-2]


加(adding)

序列相加的操作很简单,可以将序列连接在一起,但加操作只能应用于相同类型的序列,例如列表和字符串是不能连接在一起的。

#!/usr/bin/env python
str1 = "Hello, "
str2 = "world"
print str1+str2
num1 = [1, 2, 3]
num2 = [4, 5, 6]
print num1+num2



乘(multiplying)
序列的乘操作是一个序列乘一个数字n(正整数),其结果会生成一个新的序列,这个新序列内的元素为原来的序列被重复n次。

利用序列的乘操作可以初始化列表。Python中有一个內建值None,与C中的NULL和C++中的nullptr一样,代表空值。因此可以利用空值None结合乘操作来创建或者初始化序列。

str = "Hello"
print str*3
init = [None]*10
print init



成员资格检查

这个操作可以检查一个值是否在序列中,用in运算符实现,该运算符返回一个布尔值。

str = "This is a string."
print 'i' in str
print 'o' in str


长度、最小值和最大值

内建函数len、min和max分别返回序列的元素数量、最小值、最大值。

num = [8, 24, 33, 135, 1024]
print len(num)
print min(num), max(num)


列表(List)

列表是一种可变的序列,可以改变列表的内容。列表的定义方式在通用序列操作中已经出现了很多次:使用中括号[]将列表括起来,列表元素之间用逗号“,”隔开。除此之外,Python还提供了一个非常好用的内建函数list来将各种类型的序列转化为列表。

demo_of_list1 = [1, 2, 3]
print demo_of_list1
demo_of_list2 = list("Hello, world")
print demo_of_list2


列表操作
1.元素赋值

结合索引和赋值语句,可以很简单地对列表元素进行赋值(列表元素必须存在)。

#!/usr/bin/env python
tmp = [None]*10
print tmp
tmp[2] = 24
print tmp


2.元素删除

使用del语句就可以删除元素。

#!/usr/bin/env python
tmp = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print tmp
del tmp[0]
print tmp
del tmp[0:8]
print tmp


3.分片赋值

结合分片操作可以对列表中的多个元素进行赋值,甚至变相达到插入、删除元素的目的。

#!/usr/bin/env python
#coding:utf-8
num = [ 1, 2, 3, 4, 5, 6]
print num
num[0:2] = [24, 33]
print num
num[:2] = [0, 1, 2] #替换元素长度可以与被替换部分不同
print num
num[3:3] = [33, 24, 794]
print num
num[:6] = []
print num

列表方法
1.append
append用于在列表末尾追加新的对象,append方法直接修改原列表,无返回值,且一次方法调用只能追加一个对象。

#!/usr/bin/env python
#coding:utf-8

num = [1, 2, 3]
print num
num.append(4)
print num
num.append([5, 6]) #对append方法而言,这是一个元素而不是两个元素(也即一个对象)
print num


2.count
count方法统计某个元素在列表中出现的次数,返回值为统计次数。

#!/usr/bin/env python
#coding:utf-8

str =list("This is a string")
print str.count("t")
print str.count("i")
print " "
num = [1, 2, 2, 3, 4, 5, 6, 6, 6]
print num.count(2)
print num.count(6)


3.extend
extend方法可以用一个列表去扩展原有的列表,与连接操作(“+”)不同的是,extend方法修改了被扩展的序列且没有返回值,而连接操作会返回一个新列表。用分片赋值操作也可以实现相同的结果。

#!/usr/bin/env python
#coding:utf-8

num1 = [1, 2, 3]
num2 = [4, 5]
print num1
print num2
num1.extend(num2) #对象为被扩展序列,方法接受的参数为扩展序列
print num1
print num2


4.index
index方法用于从列表中找出指定值的第一个匹配项的位置并返回其索引值。

#!/usr/bin/env python
#coding:utf-8

tmp = list("Hello")
print tmp
print tmp.index("l")


5.insert
insert方法将一个对象插入到列表中,该方法接受的第一个参数为插入位置(索引),第二个参数为对象。insert方法一次只能插入一个元素。

#!/usr/bin/env python
#coding:utf-8

num1 = [1, 2, 3]
num2 = [4, 5]
print num1
print num2
num1.insert(1, num2)
print num1
num2.insert(0, 33)
print num2

6.pop
pop方法用于移除列表中的一个元素(默认是最后一个,也可以指定删除某一元素),并且返回该元素的值。使用pop方法和append方法可以实现栈操作,而队列操作可以用pop方法和insert方法来完成。

#!/usr/bin/env python
#coding:utf-8

num = [1, 2, 3, 4, 5]
print num
print num.pop()
print num
print num.pop(1) #指定删除
print num


7.remove
remove方法用于移除列表中指定值的第一个匹配项,remove方法没有返回值。

#!/usr/bin/env python
#coding:utf-8

tmp = list("Hello")
print tmp
tmp.remove("l")
print tmp


8.reverse
reverse方法将列表倒序存放(直接修改列表),没有返回值。

#!/usr/bin/env python
#coding:utf-8

num = [1, 2, 3, 4, 5, 6]
print num
num.reverse()
print num


9.sort
sort方法用于对列表进行排序(直接修改原列表),如果想要保留原列表就需要自行创建副本。sort方法的排序算法是固定的,而且默认升序。

#!/usr/bin/env python
#coding:utf-8

num1 = [33, 8, 24, 1, 5, 0, 9]
num2 = [101, 24, 135, 6, 1024]
print "num1: ", num1
num1.sort()
print "排序后:", num1
tmp = num2 #自行创建副本
tmp.sort()
print "num2: ", num2
print "tmp: ", tmp


如果希望元素能够按照特定方式排序,那么可以通过compare(x, y)的形式自定义比较函数。此外,sort方法还有另外两个可选参数key和reverse。关于sort方法的高级应用写在另一篇博文中。

元组(Tuple)

元组也是序列的一种,但与列表不同的是,元组不能修改(元组与列表在技术实现上不同)。元组由圆括号括起元组元素,元素之间用逗号分隔。还可以用tuple函数将一个序列转化为元组。

#!/usr/bin/env python
#coding:utf-8

tmp1 = (1, 2, 3)
print tmp1
tmp2 = tuple("python")
print tmp2




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值