序列(如列表和元組)饵筑、映射(如字典)以及集合(set)是三類主要的數(shù)據(jù)結(jié)構(gòu)(也稱為容器)演怎。
序列(列表瘟栖、元組和字符串)——列表為可變的(可修改)臭笆,元組和字符串是不可變的(不可修改)。
序列中的每個(gè)元素都有自己的編號(hào)市咆。Python中有6種內(nèi)建的序列:列表汉操、元組、字符串蒙兰、Unicode字符串磷瘤、buffer對(duì)象和xrange對(duì)象。
1.列表
(1)創(chuàng)建
list=[ ]
(2)list函數(shù):通過list函數(shù)(其實(shí)list是一種類型而不是函數(shù))對(duì)字符串創(chuàng)建列表非常有效
list 3=list("hello")
print list 3
輸出為:[‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
2.元組
(1)創(chuàng)建
t1=1,2,3
t2="jeffreyzhao","cnblogs"
t3=(1,2,3,4)
t4=()? #空元組可以用沒有包含內(nèi)容的圓括號(hào)來表示
t5=(1,)? #只含一個(gè)值的元組搜变,必須加個(gè)逗號(hào)(,)
print t1,t2,t3,t4,t5? #逗號(hào)分隔一些值采缚,元組自動(dòng)創(chuàng)建完成
輸出為:(1, 2, 3) (‘jeffreyzhao’, ‘cnblogs’) (1, 2, 3, 4) () (1,) #元組大部分時(shí)候是通過圓括號(hào)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?括起來的
(2)tuple 函數(shù)
t1=tuple([1,2,3]) ?#注意符號(hào)
t2=tuple("jeff") ?#當(dāng)只有()時(shí),括號(hào)中只能是1個(gè)字符或字符串挠他,且不能為數(shù)字扳抽;否則就會(huì)報(bào)錯(cuò)
t3=tuple((1,2,3))?#注意符號(hào)
printt1
printt2
printt3
3.字符串
(1)創(chuàng)建
str1='Hello world'
print str1? #輸出字符串:Hello world
print str1[0] #輸出字符串的第一個(gè)字符:H
for c in str1:
print c? ? #將字符串中的所有字符進(jìn)行單個(gè)輸出:H ?e ?l ?l ?o ? ? w ?o ?r ?l ?d
(2)格式化
字符串格式化使用字符串格式化操作符即百分號(hào)%來實(shí)現(xiàn):
str='Hello,%s' % 'world'
print str1
格式化操作符的右操作數(shù)可以是任何東西,如果是元組或者映射類型(如字典)殖侵,那么字符串格式化將會(huì)有所不同贸呢。
strs='Hello','world'#元組中字符串格式化
str1='%s,%s' %strs
print str1
d={'h':'Hello','w':'world'}#字典中字符串格式化
str1='%(h)s,%(w)s' %d
print str1
注意:如果需要轉(zhuǎn)換的元組作為轉(zhuǎn)換表達(dá)式的一部分存在,那么必須將它用圓括號(hào)括起來:
str1='%s,%s' % ('Hello','world') #此處若沒有圓括號(hào)拢军,則會(huì)報(bào)錯(cuò)
print str1
str1='%s%%' %100 #輸出%楞陷,用2個(gè)%
print str1
對(duì)數(shù)字進(jìn)行格式化處理,通常需要控制輸出的寬度和精度:
from math import pi
str1='%.2f' %pi#精度為2茉唉,輸出3.14
print str1
str1='%10f' %pi#字段寬度為10固蛾,輸出? 3.141593(前面有2個(gè)空格结执,總長度為10)
print str1
str1='%10.2f' %pi #字段寬10,精度2
print str1
Python中在string模塊還提供另外一種格式化值的方法:模板字符串艾凯。它的工作方式類似于很多UNIX Shell里的變量替換献幔,如下所示:
from string import Template
str1=Template('$x,$y!')? #使用關(guān)鍵字參數(shù)進(jìn)行格式化
str1=str1.substitute(x='Hello',y='world')
print str1 #Hello,world!
如果替換字段是單詞的一部分,那么參數(shù)名稱就必須用括號(hào)括起來趾诗,從而準(zhǔn)確指明結(jié)尾:
from string import Template
str1=Template('Hello,w${x}d!')
str1=str1.substitute(x='orl')
print str1? #Hello,world!
from string import Template
str1=Template('$x$$') #需要輸出$時(shí)蜡感,輸入2個(gè)$(同需輸出%方法相同)
str1=str1.substitute(x='100')
print str1 #100$
除了關(guān)鍵字參數(shù)之外,模板字符串還可以使用字典變量提供鍵值對(duì)進(jìn)行格式化:
from string import Template
d={'h':'Hello','w':'world'}
str1=Template('$h,$w!')? #可以使用字典變量提供鍵值對(duì)進(jìn)行格式化
str1=str1.substitute(d)
print str1 #Hello,world!
4.通用序列操作(方法)
這些操作包括:索引(indexing)沧竟、分片(sliceing)铸敏、加(adding)缚忧、乘(multiplying)以及檢查某個(gè)元素是否屬于序列的成員悟泵。除此之外,還有計(jì)算序列長度闪水、最大最小元素等內(nèi)置函數(shù).
(1)索引
索引從0(從左向右)開始糕非,所有序列可通過這種方式進(jìn)行索引。
str1='Hello'
nums=[1,2,3,4]
t1=(123,234,345)
print str1[0] #輸出為:H
print nums[1] #輸出為:2
print t1[2] #輸出為:345
索引可以從最后一個(gè)位置(從右向左)開始球榆,編號(hào)是-1:
str1='Hello'
nums=[1,2,3,4]
t1=(123,234,345)
print str1[-1] #輸出為o
print nums[-2] #輸出為:3
print t1[-3] #輸出為123
(2)分片
分片操作用來訪問一定范圍內(nèi)的元素朽肥。分片通過冒號(hào)相隔的兩個(gè)索引來實(shí)現(xiàn):
nums=range(10)
print nums #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print nums[1:5] #[1, 2, 3, 4]
print nums[1:] #[1, 2, 3, 4, 5, 6, 7, 8, 9]
print nums[-3:-1] #[7, 8]
print nums[-3:] #[7, 8, 9]
print nums[:] #復(fù)制整個(gè)序列[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
不同的步長,有不同的輸出:
nums=range(10)
print nums[0:10]#默認(rèn)步長為1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print nums[0:10:2]#步長為2,[0, 2, 4, 6, 8]
print nums[0:10:-2]#步長為-2, [ ]
(3)序列相加(只能是同類型的數(shù)據(jù)進(jìn)行相加)
str1='Hello'
str2=' world'
print str1+str2 #Hello world
num1=[1,2,3]?
num2=[2,3,4]
print num1+num2 #[1, 2, 3, 2, 3, 4](相同數(shù)字仍然會(huì)出現(xiàn))
print str1+num1 #報(bào)錯(cuò):數(shù)據(jù)類型錯(cuò)誤
(4)乘法?
print [None]*10? #[None, None, None, None, None, None, None, None, None, None]
str1='Hello'
print str1*2? #HelloHello
num1=[1,2]
print num1*2? #[1, 2, 1, 2]
print str1*num1? #報(bào)錯(cuò):數(shù)據(jù)類型錯(cuò)誤
(5)成員資格
in運(yùn)算符會(huì)用來檢查一個(gè)對(duì)象是否為某個(gè)序列(或者其他類型)的成員(即元素):
str1='Hello'
print 'h' in str1 #False
print 'H' in str1? #True
(6)長度持钉、最大最小值
通過內(nèi)建函數(shù)len衡招、max和min可以返回序列中所包含元素的數(shù)量、最大和最小元素每强。
str1='Hello'
print len(str1) #5
print max(str1) #o
print min(str1) #H
num1=[1,2,1,4,123]
print max(num1) #123
print min(num1) #1
格式化操作符的右操作數(shù)可以是任何東西始腾,如果是元組或者映射類型(如字典),那么字符串格式化將會(huì)有所不同空执。
注意:如果需要轉(zhuǎn)換的元組作為轉(zhuǎn)換表達(dá)式的一部分存在浪箭,那么必須將它用圓括號(hào)括起來:
str1='%s%%' %100#輸出%,用2個(gè)%
print str1
str1='%s%%' %100#輸出%辨绊,用2個(gè)%
print str1
str1='%s%%' %100#輸出%奶栖,用2個(gè)%
print str1
str1='%s%%' %100#輸出%,用2個(gè)%
print str1
str1='%s%%' %100#輸出%门坷,用2個(gè)%
print str1
str1='%s%%' %100#輸出%宣鄙,用2個(gè)%
print str1
二、映射(字典)
映射中的每個(gè)元素都有一個(gè)名字默蚌,這個(gè)名字專業(yè)的名稱叫鍵冻晤。字典(也叫散列表)是Python中唯一內(nèi)建的映射類型。
1敏簿、鍵類型
字典的鍵可以是數(shù)字明也、字符串或者是元組宣虾,鍵必須唯一。在Python中温数,數(shù)字绣硝、字符串和元組都被設(shè)計(jì)成不可變類型,而常見的列表以及集合(set)都是可變的撑刺,所以列表和集合不能作為字典的鍵鹉胖。鍵可以為任何不可變類型,這正是Python中的字典最強(qiáng)大的地方够傍。
d={} ?#定義空字典
d[1]=1 #對(duì)空字典中的key=1進(jìn)行賦值1
print d #打印字典甫菠,輸出{1:1}
list1=["hello,world"] #列表為可變的
set1=set([123]) #集合為可變的
d[list1]="Hello world."
d[set1]=123
print d ?#當(dāng)鍵為可變類型時(shí),報(bào)錯(cuò)
2冕屯、自動(dòng)添加
即使鍵在字典中并不存在寂诱,也可以為它分配一個(gè)值,這樣字典就會(huì)建立新的項(xiàng)安聘。
3痰洒、成員資格
表達(dá)式item in d(d為字典)查找的是鍵(containskey),而不是值(containsvalue)浴韭。
字典的操作方法可參見官方文檔丘喻。
三、集合
集合set就是由序列(或者其他可迭代的對(duì)象)構(gòu)建的念颈。集合的幾個(gè)重要特點(diǎn)和方法如下:
1泉粉、副本是被忽略的
set1=set([0,1,2,3,0,1,2,3,4,5])
print set1 #集合內(nèi)存在相同參數(shù)時(shí),進(jìn)行合并榴芳,只出現(xiàn)一次:set([0, 1, 2, 3, 4, 5])?
set2=set([0,1,2,3,4,5])
print set2? #set([0, 1, 2, 3, 4, 5])
2嗡靡、集合元素的順序是隨意的
strs=set(['jeff','wong','cnblogs'])
print strs #set([‘wong’, ‘cnblogs’, ‘jeff’])
3、集合常用方法
(1)并集:可用“union”或“|”
set1=set([1,2,3])
set2=set([2,3,4])
set3=set1.union(set2)
set4=set1|set2
print set3 #set([1, 2, 3, 4])
print set4 #set([1, 2, 3, 4])
(2)交集:用“&”
set1=set([1,2,3])
set2=set([2,3,4])
set3=set1&set2
print set3 #set([2, 3])
python set() 集合操作符號(hào)翠语、數(shù)學(xué)符號(hào)