您好,登錄后才能下訂單哦!
列表在python里是有序集合對象類型。
列表里的對象可以是任何對象:數字,字符串,列表或者字典,元組。與字符串不同,列表是可變對象,支持原處修改的操作
python的列表是:
列表的操作和字符串大部分都相同:
合并/重復:
創建一個列表:
>>> list=[]
>>> list=[1,2,'3',[]]
>>> list
[1, 2, '3', []]
列表取值:
>>> list[1]
2
>>> list[0:3]
[1, 2, '3']
重復列表內容:
>>> list*3
[1, 2, '3', [], 1, 2, '3', [], 1, 2, '3', []]
使用in方法來判斷對象是否在列表中:
>>> 3 in list
False
>>> [] in list
True
循環打印:
>>> for i in list:
... print (i,end=' ')
...
1 2 3 []
迭代方式創建列表:
>>> list=[i*4 for i in 'ASDF' ]
>>> list
['AAAA', 'SSSS', 'DDDD', 'FFFF']
矩陣:
list=[ [1,2,3,],[4,5,6],[7,8,9] ]
>>> list
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> list[0][1]
2
>>> list[1][2]
6
列表原處修改:
>>> food=['spam','eggs','milk']
>>> food[1]
'eggs'
>>> food[1]='Eggs'
>>> food[:]
['spam', 'Eggs', 'milk']
>>>food.append('cake')
>>> food
['spam', 'Eggs', 'milk', 'cake']
>>> food.sort()
>>> food
['Eggs', 'cake', 'milk', 'spam']
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list1.extend(list2)
>>> list1
[1, 2, 3, 4, 5, 6]
>>> list1.pop()
6
>>> list1
[1, 2, 3, 4, 5]
>>> list1
[1, 2, 3, 4, 5]
>>> list1.reverse()
>>> list1
[5, 4, 3, 2, 1]
>>> list=[1,2,3,4,5]
>>> list.index(3)
2
>>> list.insert(2,10)
>>> list
[1, 2, 10, 3, 4, 5]
>>> list
[1, 2, 10, 3, 4, 5]
>>> del list[2]
>>> list
[1, 2, 3, 4, 5]
>>> list=['abc','aDd','ace']
>>> sorted(list)
['aDd', 'abc', 'ace']
>>> list
['abc', 'aDd', 'ace']
>>> sorted(list,key=str.lower,reverse=True)
['aDd', 'ace', 'abc']
>>> sorted(list,key=str.lower)
['abc', 'ace', 'aDd']
>>>sorted([x.lower() for x in list])
['abc', 'ace', 'add']
>>> sorted([x.lower() for x in list],reverse=True)
['add', 'ace', 'abc']
>>> info=['myname',18,[1997,9,28]]
>>> _name,_age,_birth=info
>>> _name
'myname'
>>> _age
18
>>> _birth
[1997, 9, 28]
>>> _name,_age,(_birth_y,_birth_m,_birth_d)=info
>>> _birth_y
1997
>>> _birth_m,_birth_d
(9, 28)
當取的值不固定的時候,可以用*代替:
>>> a=['adc',122,2215,'asd@asd']
>>> a_name,*a_phone,a_mail=a
>>> a_name
'adc'
>>> a_phone
[122, 2215]
>>> from collections import deque
>>> q=deque(maxlen=3)
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q
deque([1, 2, 3], maxlen=3)
>>> q.append(4)
>>> q
deque([2, 3, 4], maxlen=3)
>>> q.appendleft('5')
>>> q
deque(['5', 2, 3], maxlen=3)
>>> from heapq import nlargest,nsmallest
>>> num=[1,4,6,7,8,8,34,64,23,7,45,34]
>>> nlargest(3,num)
[64, 45, 34]
>>> nlargest(2,num)
[64, 45]
>>> nsmallest(2,num)
[1, 4]
>>> nsmallest(4,num)
[1, 4, 6, 7]
>>> num
[1, 4, 6, 7, 8, 8, 34, 64, 23, 7, 45, 34]
>>> max(num)
64
>>> min(num)
1
>>> sum(num)
241
>>> a_info=['wanger','wangerxiao',25,'computer']
>>> _name=slice(0,2)
>>> _age=slice(2,3)
>>> _job=slice(3,4)
>>> a_info[_name]
['wanger', 'wangerxiao']
>>> a_info[_age]
[25]
>>> a_info[_job]
['computer']
>> a=[1,2,3,4,5,6,2,4,2,5,6]
>>> from collections import Counter
>>> count_word=Counter(a)
>>> count_word
Counter({2: 3, 4: 2, 5: 2, 6: 2, 1: 1, 3: 1})
>>> count_word.most_common(3)
[(2, 3), (4, 2), (5, 2)]
>>> count_word.most_common(2)
[(2, 3), (4, 2)]
字典在python里是無序集合對象類型。
字典的值都有獨立的唯一的鍵,用相應的鍵來取值。
python字典主要特性如下:
字典用法注意事項:
字典的賦值:
>>> dict={'a':97,'b':98}
>>> len(dict)
2
>>> print("ascii code of 'a' is {},ascii code of 'b' is {}".format(dict['a'],dict['b']))
ascii code of 'a' is 97,ascii code of 'b' is 98
判斷特定的鍵是否存在于字典里:
>>> 'a' in dict
True
>>> 'b
>>>> 'b' is in dict
True
#更改特定鍵的值
>>> food={'eggs':3,'ham':1,'spam':4}
>>> food['ham']=2
>>> food
{'eggs': 3, 'ham': 2, 'spam': 4}
#增加新的鍵和相應的值
>>> food['branch']=['bacon','bake']
>>> food
{'eggs': 3, 'ham': 2, 'spam': 4, 'branch': ['bacon', 'bake']}
#刪除一個字典元素
>>> del food['eggs']
>>> food
{'ham': 2, 'spam': 4, 'branch': ['bacon', 'bake']}
#清空字典所有條目
>>> dict.clear()
#刪除字典
del dict
查找字典的鍵值是否存在,如果不存在可以設置返回的值
>>> food.get('ham')
2
>>> dict.get('b')
2
>>> dict.get('0')
>>> dict.get('0','none')
'none'
創建字典的方法:
1.最原始的方法:
dict={'name':'wanger','age':25}
2.按鍵賦值方法:
>>> dict={}
>>> dict['name']='wanger'
>>> dict['age']=25
字典的比較:
字典的比較會比較字典的鍵,而不是字典的值,可以使用zip方式將字典的值和鍵反過來,這樣就會比較值了,可以使用sorted函數對字典進行排序
>>> dict={'a':1,'b':2,'c':3,'d':4}
>>> max(dict)
'd'
>>> min(dict)
'a'
>>> max(zip(dict.values(),dict.keys()))
(4, 'd')
>>> min(zip(dict.values(),dict.keys()))
(1, 'a')
>>> sorted(zip(dict.values(),dict.keys()))
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
>>> sorted(zip(dict.values(),dict.keys()),reverse=True)
[(4, 'd'), (3, 'c'), (2, 'b'), (1, 'a')]
>>> rows
[{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Clesse', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
>>> from operator import itemgetter
>>> rows_fname=sorted(rows,key=itemgetter('fname'))
>>> rows_fname
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname':
'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Clesse', 'uid': 1001}]
>>> rows_uid=sorted(rows,key=itemgetter('uid'))
>>> rows_uid
[{'fname': 'John', 'lname': 'Clesse', 'uid': 1001},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
元組與列表非常類似,只是不能在原處更改,元祖在python里的特點:
元祖創建在只有單個元素的時候,必須加逗號(,),元組里可以嵌套元組
>>> tuple=()
>>> tuple=(1,)
>>> type(tuple)
<class 'tuple'>
#這里加不加括號都一樣
>>> tuple=(1,2,'3',(4,5))
>>> tuple
(1, 2, '3', (4, 5))
>>> tuple=1,2,'3',(4,5)
>>> tuple
(1, 2, '3', (4, 5))
>>> list=[1,2,3,4]
>>> sd=tuple(list)
>>> sd
(1, 2, 3, 4)
元組的排序:
元組經過sorted排序后,會將其轉換為列表
>>> tuple=(1,5,3,6,4,2)
>>> sorted(tuple)
[1, 2, 3, 4, 5, 6]
>>> tuple
(1, 5, 3, 6, 4, 2)
>>> tuple.index(3)
2
計算元組元素數目:
>>> tuple
(1, 5, 3, 6, 4, 2)
>>> tuple.count(3)
1
元組的切片:
>>> tuple[0]
1
>>> tuple[2:]
(3, 6, 4, 2)
>>> tuple[2:3]
(3,)
>>> (1,2)+(3,4)
(1, 2, 3, 4)
>>> (1,2)*4
(1, 2, 1, 2, 1, 2, 1, 2)
>>> len(tuple)
6
set是一個無序且不重復的元素集合
集合對象十一組無序排列的可哈希的值,集合成員可以做字典中的鍵。set也支持用in 和not in操作符檢查成員,由于集合本身是無序的,不可以為集合創建索引或執行切片操作,也沒有鍵可用來獲取集合中元素的值。
>>> s=set('a')
>>> a=set({'k1':1,'k2':2})
>>> b=(['y','e','d','o'])
>>> c={'a','b','c'}
>>> d={('a','b','c')}
#比較a、b集合中a中存在,b中不存在的集合
>>> a={11,22,33}
>>> b={11,23,45}
>>> a.difference(b)
{33, 22}
#找到a中存在,b中不存在的集合,并把a、b集合中都有的值覆蓋掉
>>> a={11,22,33}
>>> print(a.difference_update(b))
None
>>> a
{33, 22}
集合的刪除:
>>> a={11,22,33}
>>> a.discard(11)
>>> a.discard(44)
>>> a
{33, 22}
#移除不存在的元素會報錯
>>> a={11,22,33}
>>> a.remove(11)
>>> a.remove(44)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 44
>>> a
{33, 22}
#移除末尾的元素
>>> a={11,22,33}
>>> a.pop()
33
>>> a
{11, 22}
取交集:
#取交集賦給新值
>>> a={1,2,3,4}
>>> b={6,5,4,3}
>>> print (a.intersection(b))
{3, 4}
#取交集并把交集賦給a
>>> print (a.intersection_update(b))
None
>>> a
{3, 4}
>>> a={3,4}
>>> b={6,5,4,3}
#判斷a是否與b沒有交集,有交集False,無交集True
>>> a.isdisjoint(b)
False
#判斷a是否是b的子集
>>> a.issubset(b)
True
#判斷a是否是b的父集
>>> a.issuperset(b)
False
>>> a={1,2,3,4}
>>> b={3, 4, 5, 6}
#打印不同的元素
>>> print (a.symmetric_difference(b))
{1, 2, 5, 6}
#打印不同的元素,并覆蓋到集合a
>>> print (a.symmetric_difference_update(b))
None
>>> a
{1, 2, 5, 6}
>>> a={1, 2, 5, 6}
>>> b={3, 4, 5, 6}
>>> print (a.union(b))
{1, 2, 3, 4, 5, 6}
集合的更新:
>>> a={1, 2, 5, 6}
>>> b={3, 4, 5, 6}
#把a、b的值合并,并把值賦給集合a
>>> a.update(b)
>>> a
{1, 2, 3, 4, 5, 6}
#添加a集合的元素
>>> a.update([7,8])
>>> a
{1, 2, 3, 4, 5, 6, 7, 8}
>>> a=set(range(5))
}
>>> li=list(a)
>>> tu=tuple(a)
>>> st=str(a)
>>> print (li)
[0, 1, 2, 3, 4]
>>> print (tu)
(0, 1, 2, 3, 4)
>>> print (st)
{0, 1, 2, 3, 4}
文件對象在python里可以作為操作系統上的文件的鏈接
文件對象的使用方式與之前的字符串、列表等對象不同,它是對文件的輸入、輸出進行控制
在python里會用open函數來進行文件的控制
在python里使用open函數可以訪問文件。
基本格式是:open(<file_address>[,access_mode])
這里的文件地址是文本形式,在Windows里由于文件地址是使用反斜杠(),所以,可以使用r來對反斜杠不進行轉義。
例如:
open(r'C:\mydir\myfile')
訪問模式里是參數,默認是r(讀取)
在訪問模式,每一種方法都有一種使用到b的方式,就是二進制模式。
文件的讀寫參數
操作說明符 | 解釋 |
---|---|
r | 以只讀方式打開文件,這是默認模式 |
rb | 以二進制格式打開一個文件用于只讀。這是默認模式 |
r+ | 打開一個文件用于讀寫 |
rb+ | 以二進制格式打開一個文件用于讀寫 |
w | 打開一個文件只用于寫入。文件存在則覆蓋,不存在,則創建新文件 |
wb | 以二進制格式打開一個文件只用于寫入。文件存在則覆蓋,不存在則創建 |
w+ | 打開一個文件用于讀寫。如果文件已存在則將其覆蓋,不存在則創建新文件。 |
wb+ | 以二進制打開一個文件用于讀寫。如果該文件存在則覆蓋,不存在則創建 |
a | 打開一個文件用于追加,如果文件內容存在,則將新內容追加到文件末尾,不存在則創建新文件寫入 |
ab | 以二進制格式打開一個文件用于寫入 |
a+ | 打開一個文件用于讀寫,如果該文件存在,則會將新的內容追加到文件末尾,如果文件不存在,則創建新文件用于讀寫。 |
ab+ | 以二進制格式打開一個文件用于追加,文件存在將追加,不存在則創建新文件用于讀寫 |
例子
>>> file1=open(r'D:\ruanjian\1.txt','w')
>>> file1.write('hello,world')
11
>>> file1.close()
>>> file1=open(r'D:\ruanjian\1.txt')
>>> file1.read()
'hello,world'
#tell用于獲取文件指針位置,文件讀取之后,文件指針在最后面
>>> file1.tell()
11
>>> file1.close()
>>>> file1=open(r'D:\ruanjian\1.txt')
>>> file1.seek(6)
6
>>> file1.read(5)
'world'
當我們要讀取前五個字符的時候可以這樣:
>>> file1=open(r'D:\ruanjian\1.txt')
>>> file1.read(5)
'hello'
>>> file1.tell()
5
當我們要按行讀取的時候,可以使用readline和readlines方法
>>> file1=open(r'D:\ruanjian\1.txt')
>>> file1.readline()
'hello,world\n'
>>> file1.readline()
'wanger\n'
>>> file1.readline()
'asdfgghh'
>>> file1.readline()
''
>>> file1=open(r'D:\ruanjian\1.txt')
>>> file1.readlines()
['hello,world\n', 'wanger\n', 'asdfgghh']
當我們需要寫入到一個文件的時候,會使用w模式。當相應的文件存在時,會覆蓋原先的文件然后寫入,當相應的文件不存在時會創建新文件。
基本寫入
>>> file=open(r'D:\ruanjian\1.txt','w')
>>> file.write('hello,world')
11
>>> file.write('|wanger')
7
>>> file.flush()
>>> file.close()
>>> file=open(r'D:\ruanjian\1.txt')
>>> file.read()
'hello,world|wanger'
在這里flush()方法是把緩存里的內容寫入硬盤中。當運行close()方法的時候,也會進行同樣操作。
按列表寫入:
writelines是把列表里的元素一個一個輸入進去。當然,元素里的字符串最后沒有換行,最終結果也不是換行的。
>>> list=['hello,world!\n','wanger\n','asdfgh\n']
>>> file=open(r'D:\ruanjian\1.txt','w')
>>> file.writelines(list)
>>> file.close()
>>> file=open(r'D:\ruanjian\1.txt')
>>> file.read()
'hello,world!\nwanger\nasdfgh\n'
在特定位置寫入
當我們輸入錯誤的時候,可以把指針挪到最前面,然后繼續輸入。seek可以有兩個傳遞變量,只有一個變量或者第一個變量為0時,就是更改當前的指針,第二個變量為1的時候,會返回當前指針位置,這個與tell方法同樣,最后,第一個變量為0,第二個變量為2的時候會把指針放到最后
>>> file=open(r'D:\ruanjian\1.txt','w')
>>> file.write('heelo')
5
>>> file.seek(0)
0
>>> file.write('hello')
5
>>> file=open(r'D:\ruanjian\1.txt')
>>> file.read()
'hello'
在最后寫入
之前看到的w模式,當文件是已有文件,就會刪除里面的所有內容后再寫入的。當我們需要在最后添加,而不是刪除原有內容時,可以使用a模式。
>>> file=open(r'D:\ruanjian\1.txt')
>>> file.read()
'hello'
>>> file.close()
>>> file=open(r'D:\ruanjian\1.txt','a')
>>> file.write('my name is wanger')
17
>>> file=open(r'D:\ruanjian\1.txt')
>>> file.read()
'hellomy name is wanger'
在模式里,我們會看到r+,w+,a+三種模式都有讀寫的方法。
r+模式,只能打開已有文件,打開時保留原有文件,對文件可讀,可寫,也可更改原有內容。打開是指針在文件最前面。
w+模式,打開時沒有相應的文件,會創建;有相應的文件會覆蓋原有的內容
a+模式,可以打開原有文件,也可創建新的文件,打開時指針為文件的最后位置。指針可以放到任何位置來讀內容,但寫入時,指針默認會移動到最后,然后寫入。
模式 | 打開已有文件 | 打開新的文件 | 打開時指針位置 | 寫入時指針位置 |
---|---|---|---|---|
r+ | 保留內容 | 發生錯誤 | 文件開頭 | 當前位置 |
w+ | 刪除內容 | 創建文件 | 文件開頭 | 當前位置 |
a+ | 保留內容 | 創建文件 | 文件尾端 | 文件尾端 |
>>> cha='啊'
>>> cha_b=cha.encode()
>>> file=open(r'D:\ruanjian\1.txt','w')
>>> file.write(cha)
1
>>> file.write(cha_b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not bytes
>>> file.close()
>>> file=open(r'D:\ruanjian\1.txt')
>>> file.read()
'啊'
>>> file=open(r'D:\ruanjian\1.txt','wb')
>>> file.write(cha)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
>>> file.write(cha_b)
3
>>> file.close()
>>> file=open(r'D:\ruanjian\1.txt','rb')
>>> file.read()
b'\xe5\x95\x8a'
>>> file=open(r'D:\ruanjian\1.txt','w')
>>> file.write({'a':97})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not dict
>>> file.write(str({'a':97}))
9
>>> file.write(str([1,2]))
6
>>> file.close()
>>> file=open(r'D:\ruanjian\1.txt')
>>> file.read()
"{'a': 97}[1, 2]"
如果要將存儲的字符串轉換回原來的數據類型,可以用pickle模塊:
>>> file=open(r'D:\ruanjian\1.txt','wb')
>>> a={'a':97}
>>> pickle.dump(a,file)
>>> file.close()
>>> file=open(r'D:\ruanjian\1.txt','rb')
>>> a_=pickle.load(file)
>>> a_
{'a': 97}
需要把打印的內容直接輸出到文件里的時候:
>>> with open (r'D:\ruanjian\1.txt','w') as f:
... print ('hello,world!',file=f)
...
>>> with open (r'D:\ruanjian\1.txt') as f:
... f.read()
...
'hello,world!\n'
因為w方式對已存在的文件會清楚后寫入,但有的時候我們不想覆蓋原有的文件,我們可以使用如下方式:
>>> if not os.path.exists(r'D:\ruanjian\1.txt'):
... with open(r'D:\ruanjian\1.txt','wt') as f:
... f.write('hello,world')
... else:
... print ('file already exists')
...
file already exists
在python3.x中我們也可以使用這種方式來判斷文件是否存在,存在的話會報錯,不存在的話文件可以創建
>>> with open(r'D:ruanjian\2.txt','xt') as f:
... f.write('hello\n')
...
6
>>> with open(r'D:ruanjian\2.txt','xt') as f:
... f.write('hello\n')
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'D:ruanjian\\2.txt'
文件在存儲時也可以壓縮存儲,需要用到gzip或者bz2模塊,在這兩個模塊中,默認是二進制模式,因此需要使用wt,rt等,指定text模式。讀的時候使用rt,和read()。
壓縮級別可以用compresslevel來設置,也可以使用open里的encoding,errors,newline等。
>>> with gzip.open(r'D:\ruanjian\1.gz','wt') as f:
... f.write('text')
...
4
>>> with gzip.open(r'D:\ruanjian\1.gz','rt') as f:
... f.read()
...
'text'
>>> with bz2.open(r'D:\ruanjian\1.bz2','wt') as f:
... f.write('hello,world')
...
11
>>> with bz2.open(r'D:\ruanjian\1.bz2','rt') as f:
... f.read()
...
'hello,world'
這要用到os模塊里的方法,關于os模塊可以查看公眾號的歷史消息,對os模塊有詳細的解釋,這里只列出一些簡單的方法:
>>> import os
>>> os.getcwd()
'/root/blog'
>>> os.listdir('.')
['_config.yml', 'node_modules', '.gitignore', 'source', 'db.json', 'themes', 'package.json', 'public', 'scaffolds', '.deploy_git']
#當需要判斷是文件時
>>> files=[file for file in os.listdir('.') if os.path.isfile(os.path.join('.',file))]
>>> files
['_config.yml', '.gitignore', 'db.json', 'package.json']
歡迎各位關注我的微信公眾號
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。