天天看點

Python資料類型——序列(字元串,清單,元組)

Python的資料通路模型:直接存取 ,序列 ,映射

對非容器類都可以直接存取,所有的數值類型歸為此類。

序列類型是指容器内的元素從0開始的索引順序通路,一次可以通路一個或者多個元素。 字元串清單元組歸到次類

映射類型和序列類型不同之處,它使用的索引和順序的數字偏移量不同,它的元素無序存放,通過唯一的key來通路。 字典就是這種類型。

下面要說的字元串(strings),清單(lists),元組(tuples),我們可以統稱為序列。

序列有着相同的通路模式:它的每一個元素都可以通過指定一個偏移量的方式得到,而要想一次得到多個元素,我們可以使用切片,下表偏移量從0開始,總元素數減1結束。

下面舉幾個例子,先看看什麼事字元串,清單,元組。

字元串:

>>> a = 'HelloPython!'

>>> a

'Hello Python!'

>>> b = "This is'Python'"

>>> b

"This is 'Python'"

>>> c = 'This is"Python"'

>>> c

'This is "Python"'

>>>

清單:

>>> a = [1, 2, 3, 4,5]

>>> a

[1, 2, 3, 4, 5]

>>> b = [1, 'a', 2.5,2+3j, "this is python list"]

>>> b

[1, 'a', 2.5, (2+3j), 'this is pythonlist']

>>>

元組:

>>> a = (1, 3, 5,7)

>>> a

(1, 3, 5, 7)

>>> a = ('a',2)

>>> a

('a', 2)

>>>

下面看一下序列通用的幾個操作符:

1 連接配接操作符(+) 這個操作符允許我們把一個序列和另一個相同的序列做連結。

Sequence1+sequence2 結果是包含兩個原序列内容的新序列。

>>> a = 'this is '

>>> b = 'Python'

>>> a+b

'this is Python'

>>>

2 重複操作符(*)

當你需要一個序列的多份拷貝時,重複操作符非常有用。

Sequence * copies_int

Copies_int必須為整型。

>>> a

'this is Python'

>>> a*3

'this is Pythonthis is Pythonthis isPython'

>>>

>>> b = [1, 2, 3]

>>> b*3

[1, 2, 3, 1, 2, 3, 1, 2, 3]

>>>

3 切片操作符 [ ] [:] [: : ]

切片操作符應該是由最簡單的取單個元素的操作擴充而來的。通常sequence[n]代表取出序列中第n+1個元素(因為元素下标從0開始)

>>> a = 'Python'

>>> a[2]

't'

>>> b = [1, 2, 3,4]

>>> b[2]

3

>>> c = (1, 2, 3)

>>> c[2]

3

>>>

當中括号裡面有個:的時候,代表冒号兩邊的數字規定了兩個位置,我們把處于這個位置之中的所有元素取了出來。如果冒号兩邊什麼都沒有,代表取出所有元素,如果兩邊有數,例如sequence[m:n]就是代表取出從下标為m的元素到下标為n-1的所有元素。如果中括号裡兩個冒号,那麼兩個冒号後面的數代表步長,就是隔幾個元素取一次。下面一字元串為例詳細說明。(其他的序列操作類似)

>>> a = 'Python'

>>> a[1]

'y'

>>> a[:]

'Python'

>>> a[1:4]

'yth'

>>> a ='10001000100010001'

>>> a[0:17:4]

'11111'

>>>

另外切片支援負數操作。比如

>>> a = 'Python'

>>> a[-1]

'n'

>>> a[-2]

'o'

>>> a[-6]

'P'

>>>

由此我們就可以很随意的取元素了。但是注意一點,平時我們不加步長,是因為我們預設是順序取,并且步長為1,假如我們要倒着取,步長必須為負數才行,否則取的不正确。

>>> a = 'Python'

>>> a[-2:-4]

''                  這是錯誤的

>>> a[-4:-2]

'th'

>>> a[-2:-4:-1]

'oh'

>>> a[::-1]

'nohtyP'

>>>

4 成員操作符( in , not in )

>>> a = 'Python'

>>> 'p' in a

False

>>> 'y' in a

True

>>> b = [1, 2, 3,4]

>>> 1 in b

True

>>> 5 in b

False

>>>

序列的一些常用的公用函數:

1 len() 獲得序列的長度

>>> a = 'ddddddd'

>>> b = [1, 3, 4,4]

>>> c = (1,3,4,4)

>>> len(a)

7

>>> len(b)

4

>>> len(c)

4

>>>

得出一點結論,Python字元串和C字元串不同的地方,Python字元串不會以空字元結尾

2 max() and min() 獲得序列中最大和最小元素

>>> a = 'abcdefg'

>>> b = [1, 3, 5,8]

>>> c = (2, 5, 1,0)

>>> d =['a',3,45,9]

>>> max(a)

'g'

>>> max(d)

'a'

>>> min(b)

1

>>> min(c)

>>>

下面接着看看标準内建函數:

1 type(object) 接受一個對象作為參數,并傳回它的類型。

>>type(2)

>><type‘int’>

>>type(‘a’)

>><type‘str’>

2 cmp()  比較大小

>>> a = 4

>>> b = 8

>>> cmp(a,b)

-1

>>> cmp(b,a)

1

>>> a = 3

>>> b = 3

>>> cmp(a,b)

>>> a = 'lmn'

>>> b = 'abc'

>>> cmp(a,b)

1

>>>

3 str()  和repr()

>>> str(4.53-2j)

'(4.53-2j)'

>>> str(1)

'1'

>>> str([1, 3, 4,5])

'[1, 3, 4, 5]'

>>> repr([1, 3, 4,5])

'[1, 3, 4, 5]'

>>> '[1, 3, 4, 5]'

'[1, 3, 4, 5]'

>>>

-----------------------------------------------------------------------------------------------------------------------------

下面就看一看字元串,清單,元組各自常有的操作符和内建函數:

字元串

首先我覺得最重要的就是字元串的格式化輸出了”%”(Formatting)

>>> format ="Hello,%s,%s enough for ya?"

>>> values =('world','Hot')

>>> print format %values

Hello,world,Hot enough for ya?

>>> 

%代表了要插入的位置,s代表了要插入的資料類型是str,因為這裡我們要插入兩個地方,是以我們用到了values這個元組。注意,格式化輸出要插入多個資料的時候,隻有元組和字典具有這個資格,不能使用清單,清單隻能代表一個資料。

>>> values =['world','Hot']

>>> print format %values

Hello,['world', 'Hot'] enough for ya?

>>> 

>>> print 'you areNo.%s' % 1

you are No.1 

如果給的資料不是str類型的,%s會自動用str()把它轉換為str類型

如果要格式化輸出一個控制精度的浮點數,可以如下:

>>> PI =3.1415926

>>> print "PI is%.3f" % PI

PI is 3.142

>>> 

但是從上面可以看到,使用格式化操作符還是不友善的,因為經常要注意格式轉換的問題,%s格式系統會自動為我們轉換那些輸入不是str類型的資料,但是别的格式化輸出符,還是需要我們自己去轉化,如果要輸出的格式有好多種,用起來還是比較複雜的。

Template strings字元串模闆            

字元串模闆使我們不用去管輸出傳遞的細節,而是像現在shell風格的腳本裡面使用符号“$”

>>> from stringimport Template

>>> s =Template("There are ${howmany} ${lang} Quotation Symbols")

>>> prints.substitute(,howmany=3)

There are 3 Python Quotation Symbols

>>>s.substitute(,howmany=3)

'There are 3 Python Quotation Symbols'

>>> prints.substitute()

Traceback (most recent call last):

  File"<pyshell#50>", line 1, in<module>

    prints.substitute()

  File "C:\Python26\lib\string.py", line 170,in substitute

    returnself.pattern.sub(convert, self.template)

  File "C:\Python26\lib\string.py", line 160,in convert

    val =mapping[named]

KeyError: 'howmany'

>>> prints.safe_substitute(,howmany=3)

There are 3 Python Quotation Symbols

>>> prints.safe_substitute(howmany=3)

There are 3 ${lang} Quotation Symbols

>>> 

Template對象有兩個方法,substitute()  和safe_substitute()前者更為嚴謹,在key缺少的情況下會報錯KeyError,而後者在缺少Key時,直接安缺少的情況把字元串輸出顯示出來。

在這裡如果要輸出$符号,我們可以用$$

String Methods 字元串函數

1 find() 查找某個字元在字元串中是否存在,并傳回結果。找到傳回位置,沒有則傳回-1

>>> title = "MontyPython's Flying Circus"

>>>title.find("Monty")

>>>title.find('Python')

6

>>>title.find('Flying')

15

>>>title.find('Zirquss')

-1

>>> 

Find也可以帶參數,來限制查找的範圍,比如:find(’a’,1,10)

 就是查找字元’a’,查找範圍是從标号為1的元素開始到标号為9的元素截止(和切片類似)。

2 join()函數

>>> seq = ['1','2', '3', '4', '5']

>>> sep = '+'

>>>sep.join(seq)

'1+2+3+4+5'

>>> seq

['1', '2', '3', '4', '5']

>>>'+'.join(seq)

'1+2+3+4+5'

>>>'%'.join(seq)

'1%2%3%4%5'

>>>'#$%'.join(seq)

'1#$%2#$%3#$%4#$%5'

>>> dirs = '','usr','bin','env'

>>>'/'.join(dirs)

' /usr/bin/env'

>>> print'C:'+'\\'.join(dirs)

C: \usr\bin\env

>>> 

3       lower()

>>> "TrindhermHammer Dance".lower()

'trindherm hammer dance'

>>> 

4       replace()  替換

 >>>"This is a test".replace('is','AAA')

'ThAAA AAA a test'

>>> 

字元串的函數很多,而且參數也有變化,功能也多,這裡就不一一列舉了。

清單

清單也是序列式的資料類型,可以通過下标或者切片操作來通路一個或者多個元素。清單和字元串不同的地方在,字元串隻能由字元組成,而且不是可變的(不能單獨改變它的某個值),而清單則是儲存任何數目的Python對象的靈活的容器。

對清單的一些操作:

1 通路清單中的元素

>>>alist = [1, 2,3, 4]

>>>alist[1]

2

>>> 

另外清單和其他序列一樣,也可以進行切片操作

2更新清單的元素,看下面的例子:

>>> str1 = "stringcan not be changed"

>>> str1[0]

's'

>>> str1[0]='S'

Traceback (most recent call last):

  File"<pyshell#2>", line 1, in<module>

   str1[0]='S'

TypeError: 'str' object does not support item assignment

>>> tuples1 = (1,2, 3, 4)

>>> tuples1[0]

1

>>> tuples1[0] =2

Traceback (most recent call last):

  File"<pyshell#5>", line 1, in<module>

   tuples1[0] = 2

TypeError: 'tuple' object does not support item assignment

>>> list1 = [1,'a', 3, 5]

>>> list1[1]

'a'

>>> list1[1] ='b'

>>> list1

[1, 'b', 3, 5]

>>> 

可以看到,同樣作為序列的字元串和元組,值是不可改變的,我們可以改變的隻能是給他重新指派,然後以前的值會被銷毀。但是清單卻不同,清單可以對其裡面的任意元素做任意操作,改變,添加,删除等等。

3  del 删除操作:

>>> list1

[1, 'b', 3, 5]

>>> dellist1[0]

>>> list1

['b', 3, 5]

>>> del list1

>>> list1

Traceback (most recent call last):

  File"<pyshell#17>", line 1, in<module>

    list1

NameError: name 'list1' is not defined

>>> 

Del既可以删除一個元素,也可以删除整個清單。

5       append 在清單結尾添加新元素:

>>> lst = [1, 2,3]

>>>lst.append(4)

>>> lst

[1, 2, 3, 4]

>>> 

6 count 傳回該元素的個數

>>> lst = [1, 2, 2,3, 3, 3]

>>>lst.count(1)

1

>>>lst.count(2)

2

>>>lst.count(3)

3

>>> 

6       extend 允許你一次把清單擴充多個元素

>>> a = [1, 2,3]

>>> b = [4, 5,6]

>>> a.extend(b)

>>> a

[1, 2, 3, 4, 5, 6]

>>> a = [1, 2,3]

>>> b = [4, 5,6]

>>> a+b

[1, 2, 3, 4, 5, 6]

>>> a

[1, 2, 3]

>>> 

可以看出和”+”操作還是不同的

7       index 傳回元素的位置

>>> ind =['Python', 'is', 'powerful']

>>>ind.index('is')

1

>>> 

8       insert 插入一個元素

>>> numbers = [1,2, 3, 5, 6, 7]

>>>numbers.insert(3,'four')

>>> numbers

[1, 2, 3, 'four', 5, 6, 7]

>>> 

Insert 第一個參數表示要插入的位置,第二是要插入的内容。

9       pop 和 remove

>>> numbers

[1, 2, 3, 'four', 5, 6, 7]

>>>numbers.remove('four')

>>> numbers

[1, 2, 3, 5, 6, 7]

>>> 

Remove類似于del

>>> numbers

[1, 2, 3, 5, 6, 7]

>>>numbers.pop()

7

>>> numbers

[1, 2, 3, 5, 6]

>>>numbers.pop(0)

1

>>> numbers

[2, 3, 5, 6]

>>> 

Pop不帶參數,是把清單最後一個元素删除了,當然可以指定位置。

10 reverse   翻轉

>>> numbers

[2, 3, 5, 6]

>>>numbers.reverse()

>>> numbers

[6, 5, 3, 2]

>>> 

10    排序sort()

>>> x = [4, 6, 1,7, 2, 5, 3]

>>> x.sort()

>>> x

[1, 2, 3, 4, 5, 6, 7]

>>> x =['abcdefg','ab','abcd','a','abc']

>>>x.sort(key=len)

>>> x

['a', 'ab', 'abc', 'abcd', 'abcdefg']

>>> x = [1, 2, 3,4, 5, 6]

>>>x.sort(reverse=True)

>>> x

[6, 5, 4, 3, 2, 1]

使用指令dir(list)可以列出清單的全部方法和屬性,這裡不一一舉例了。

>>> dir(list)

['__add__', '__class__', '__contains__', '__delattr__','__delitem__', '__delslice__', '__doc__', '__eq__', '__format__','__ge__', '__getattribute__', '__getitem__', '__getslice__','__gt__', '__hash__', '__iadd__', '__imul__', '__init__','__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__','__new__', '__reduce__', '__reduce_ex__', '__repr__','__reversed__', '__rmul__', '__setattr__', '__setitem__','__setslice__', '__sizeof__', '__str__', '__subclasshook__','append', 'count', 'extend', 'index', 'insert', 'pop', 'remove','reverse', 'sort']

>>> 

元組

元組是跟清單非常相近的另外一種容器類型,兩者重要不同點是:元組和字元串一樣,是一種不可變類型。

關于元組的建立,通路,切片等一些序列公有的操作這裡就不說了。

元組是不可改變的,也就說不能對元組的某一個元素進行改變,但是我們可以對整個元素進行重新指派,同樣能達到對元組進行改變的目的,比如:

>>> aTuple = (1,'a', 2, 'b', 'c')

>>> aTuple =aTuple[0],aTuple[2]

>>> aTuple

(1, 2)

>>> 

下面是元組的一些操作:

>>> dir(tuple)

['__add__', '__class__', '__contains__', '__delattr__','__doc__', '__eq__', '__format__', '__ge__', '__getattribute__','__getitem__', '__getnewargs__', '__getslice__', '__gt__','__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__','__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__','__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__','__subclasshook__', 'count', 'index']

來源:http://blog.sina.com.cn/s/blog_4b5039210100e9yd.html

來源:http://blog.sina.com.cn/s/blog_4b5039210100e9yg.html