1. 程式人生 > >pyhton list和str比較

pyhton list和str比較

相同點

### 都屬於序列型別的資料
所謂序列型別的資料,就是說它的每一個元素都可以通過指定一個編號,行話叫做“偏移量”的方式得到,而要想一次得到多個元素,可以使用切片。偏移量從0開始,總元素數減1結束。
例如:

>>> welcome_str = "Welcome you"
>>> welcome_str[0]
'W'
>>> welcome_str[1]
'e'
>>> welcome_str[len(welcome_str)-1]
'u'
>>> welcome_str[:4]
'Welc'
>>> a = "python"
>>> a*3
'pythonpythonpython'

>>> git_list = ["hiekay","github","io"]
>>> git_list[0]
'hiekay'
>>> git_list[len(git_list)-1]
'io'
>>> git_list[0:2]
['hiekay', 'github']
>>> b = ['hiekay']
>>> b*7
['hiekay', 'hiekay', 'hiekay', 'hiekay', 'hiekay', 'hiekay', 'hiekay']

對於此類資料,下面一些操作是類似的:

>>> first = "hello,world"
>>> welcome_str
'Welcome you'
>>> first+","+welcome_str   #用+號連線str
'hello,world,Welcome you'
>>> welcome_str             #原來的str沒有受到影響,即上面的+號連線後從新生成了一個字串
'Welcome you'
>>> first
'hello,world'

>>> language = ['python']
>>> git_list
['hiekay', 'github', 'io']
>>> language + git_list     #用+號連線list,得到一個新的list
['python', 'hiekay', 'github', 'io']
>>> git_list
['hiekay', 'github', 'io']
>>> language
['python']

>>> len(welcome_str)    #得到字元數
11
>>> len(git_list)       #得到元素數
3

區別

list和str的最大區別是:list是可以改變的,str不可變。這個怎麼理解呢?
首先看對list的這些操作,其特點是在原處將list進行了修改:

>>> git_list
['hiekay', 'github', 'io']

>>> git_list.append("python")
>>> git_list
['hiekay', 'github', 'io', 'python']

>>> git_list[1]
'github'
>>> git_list[1] = 'github.com'
>>> git_list
['hiekay', 'github.com', 'io', 'python']

>>> git_list.insert(1,"algorithm")
>>> git_list
['hiekay', 'algorithm', 'github.com', 'io', 'python']

>>> git_list.pop()
'python'

>>> del git_list[1]
>>> git_list
['hiekay', 'github.com', 'io']
  • 以上這些操作,如果用在str上,都會報錯,比如:
>>> welcome_str
'Welcome you'

>>> welcome_str[1]='E'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

>>> del welcome_str[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object doesn't support item deletion

>>> welcome_str.append("E")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'append'
如果要修改一個str,不得不這樣。
>>> welcome_str
'Welcome you'
>>> welcome_str[0]+"E"+welcome_str[2:]  #從新生成一個str
'WElcome you'
>>> welcome_str                         #對原來的沒有任何影響
'Welcome you'

其實,在這種做法中,相當於從新生成了一個str。

多維list

這個也應該算是兩者的區別了,雖然有點牽強。在str中,裡面的每個元素只能是字元,在list中,元素可以是任何型別的資料。前面見的多是數字或者字元,其實還可以這樣:

>>> matrix = [[1,2,3],[4,5,6],[7,8,9]]
>>> matrix = [[1,2,3],[4,5,6],[7,8,9]]
>>> matrix[0][1]
2
>>> mult = [[1,2,3],['a','b','c'],'d','e']
>>> mult
[[1, 2, 3], ['a', 'b', 'c'], 'd', 'e']
>>> mult[1][1]
'b'
>>> mult[2]
'd'

以上顯示了多維list以及訪問方式。在多維的情況下,裡面的list也跟一個前面元素一樣對待。

list和str轉化

str.split()

這個內建函式實現的是將str轉化為list。其中str=""是分隔符。
在看例子之前,請看官在互動模式下做如下操作:

>>>help(str.split)
>>> line = "Hello.I am hiekay.Welcome you."

>>> line.split(".")     #以英文的句點為分隔符,得到list
['Hello', 'I am hiekay', 'Welcome you', '']

>>> line.split(".",1)   #這個1,就是表達了上文中的:If maxsplit is given, at most maxsplit splits are done.
['Hello', 'I am hiekay.Welcome you.']

>>> name = "Albert Ainstain"    #也有可能用空格來做為分隔符
>>> name.split(" ")
['Albert', 'Ainstain']
>>> s = "I am, writing\npython\tbook on line"   #這個字串中有空格,逗號,換行\n,tab縮排\t 符號
>>> print s         #輸出之後的樣式
I am, writing
python  book on line
>>> s.split()       #用split(),但是括號中不輸入任何引數
['I', 'am,', 'writing', 'python', 'book', 'on', 'line']

如果split()不輸入任何引數,顯示就是見到任何分割符號,就用其分割了。

“[sep]”.join(list)

join可以說是split的逆運算,舉例:

>>> name
['Albert', 'Ainstain']
>>> "".join(name)       #將list中的元素連線起來,但是沒有連線符,表示一個一個緊鄰著
'AlbertAinstain'
>>> ".".join(name)      #以英文的句點做為連線分隔符
'Albert.Ainstain'
>>> " ".join(name)      #以空格做為連線的分隔符
'Albert Ainstain'

回到上面那個神奇的例子中,可以這麼使用join.

>>> s = "I am, writing\npython\tbook on line"
>>> print s
I am, writing
python  book on line
>>> s.split()
['I', 'am,', 'writing', 'python', 'book', 'on', 'line']
>>> " ".join(s.split())         #重新連線,不過有一點遺憾,am後面逗號還是有的。怎麼去掉?
'I am, writing python book on line'