程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python學習2(列表、元組、字典,集合set)

編輯:Python

千峰教育在b站的課程,學習筆記

列表list

定義列的格式:[元素1, 元素2, 元素3, …, 元素n]

變量tmp的類型為列表
tmp = [‘xiaoWang’,180, 65.0]
列表中的元素可以是不同類型的
列表切片操作和字符串一樣

添加元素

append會把新元素添加到列表末尾
insert(index, object) 在指定位置index前插入元素object
通過extend可以將另一個集合中的元素逐一添加到列表中,也可以通過+號

list1 = ['a','b','c']
list2 = ['d','e']
list1 = list1 + list2
print(list1) #['a', 'b', 'c', 'd', 'e']

刪除元素

列表元素的常用刪除方法有:

del:根據下標進行刪除,或者直接刪除整個列表(直接刪除變量指針,變量名被垃圾回收了)
pop:刪除最後一個元素,或者根據下標刪除列表中的元素
remove:根據元素的值進行刪除,如果有相同的好幾個值,那麼只刪除從左到右的第一個
clear:清空列表元素(內存沒有被釋放)

用for循環刪除的時候需要注意,刪除了元素遍歷的下標不會改變,所以可能存在漏刪的情況

movieName = ['加勒比海盜','駭客帝國','第一滴血','指環王','霍比特人','速度與激情']
print('------刪除之前------movieName=%s' % movieName)
del movieName[2]
print('------刪除之後------movieName=%s' % movieName)

刪除連續相同的元素
如果正常寫這樣刪除,會有問題

list3 = [1,1,3,1,1,5]
for i in list3:
if i == 1:
list3.remove(i)
print(list3) # [3, 1, 1, 5]

這個是因為遍歷的時候是用下標遍歷list3中所有元素,如果刪除以後,下標仍然後加1,而列表變小了,所以會跳過連續相同的元素

但是下面這個操作是可行的,因為list3[::]相當於創建了一個新的列表,遍歷的並不是list3中的元素,而是新的列表中的元素,而新列表和原列表是相同的,所以這樣刪除是可行的

list3 = [1,1,3,1,1,5]
for i in list3[::]:
if i == 1:
list3.remove(i)
print(list3)

查找

判斷是否存在 in、not in
in(存在),如果存在那麼結果為true,否則為false
not in(不存在),如果不存在那麼結果為true,否則false
index用來查找元素所在的位置,如果未找到則會報錯;
count用來計算某個元素出現的次數。
它們的使用和字符串裡的使用效果一致。

>>> a = ['a', 'b', 'c', 'a', 'b']
>>> a.index('a', 1, 3) # 注意是左閉右開區間
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 'a' is not in list
>>> a.index('a', 1, 4)
3
>>> a.count('b')
2
>>> a.count('d')
0

修改

直接用下標改就可以

排序翻轉

sort方法是將list按特定順序重新排列,默認為由小到大,參數reverse=True可改為倒序,由大到小。
reverse方法是將list逆置。

交換兩個變量值

除了使用第三個中間變量以外,python中可以直接使用下面方法交換
a,b = b,a

列表推導式

所謂的列表推導式,就是指的輕量級循環創建列表

基本方式

a = [x for x in range(3,6)]
# [3, 4, 5]

在循環中使用if

a = [x for x in range(9) if x % 2]
# [1, 3, 5, 7]
# 使用if和列表推導式的結合
list1 = ['hello', 'hi', 'too','high','88']
list2 = [word.title() if word.startswith('h') else word.upper() for word in list1]
print(list2) # ['Hello', 'Hi', 'TOO', 'High', '88']

使用多個for循環創建

a = [(x,y,z) for x in range(1,3) for y in range(2) for z in range(3)]
# [(1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2)]
a = [x for x in range(1,101)]
b = [a[x:x+3] for x in range(0,len(a),3)]
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], ...]

列表的復制

前面也提到過,如果僅僅是用list2 =list1 復制一個列表,僅僅是將list2這個變量的指針指向了list1的內存地址,如果這時候用list2修改列表中內容,list1也會發生改變
即:Python中的賦值運算都是引用(即內存地址)的傳遞。對於可變類型來說,修改原數據的值,會改變賦值對象的值。

使用列表的copy方法

使用列表的copy方法,可以直接將原來的列表進行復制,變成一個新的列表,這種復制方式是淺拷貝。

nums1 = [1, 5, 8, 9, 10, 12]
nums2 = nums1.copy() # 調用列表的copy方法,可以復制出一個新的列表
nums2[0] = 100
# 修改新列表裡的數據,不會影響到原有列表裡的數據
print(nums2) # [100, 5, 8, 9, 10, 12]
print(nums1) # [1, 5, 8, 9, 10, 12]

copy模塊

除了使用列表的copy方法以外,Python還提供了copy模塊來復制一個對象。copy模塊提供了淺拷貝和深拷貝兩種方式,它們的使用方式相同,但是執行的效果有一定的差異。

淺拷貝是對於一個對象的頂層拷貝,通俗的理解是:拷貝了引用,並沒有拷貝內容。
從下面的例子可以看到,僅僅是對最上層的引用進行了拷貝,對最上層的內容進行更改時,並沒有將原來words1中的元素進行替換,而在對內層,即第二層列表的元素進行修改時,yes變成了no

import copy
words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
# 淺拷貝只會拷貝最外層的對象,裡面的數據不會拷貝,而是直接指向
words2 = copy.copy(words1)
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['no', 'ok'], 'bad']
# wrods2 裡的 yes 被修改成了 no
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']

深拷貝是對於一個對象所有層次的遞歸拷貝。
用deepcopy拷貝是將裡面的所有內容都拷貝了,所以對拷貝對象進行修改的時候,不會影響原內容

import copy
words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
# 深拷貝會將對象裡的所有數據都進行拷貝
words2 = copy.deepcopy(words1)
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['yes', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']

切片也是一種淺拷貝

words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
words2 = words1[:]
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['no', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']
word3 = ['h', 'a']
print(words1) # ['hello', 'good', ['yes', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['h', 'a'], 'bad']

元組tuple

Python的元組與列表類似,不同之處在於元組的元素不能修改。元組使用小括號,列表使用方括號。
訪問元組也是直接使用下標就可以了,或者使用切片
查找元素,index和count
不能進行增、刪、改

特別注意:定義只有一個元素的元組,需要在唯一的元素後寫一個逗號

>>> aTuple = ('et',77,99.9)
>>> aTuple
('et',77,99.9)
# 特別注意
t1 = ()
t2 = ('a')
t3 = ('a',)
print(type(t1))
print(type(t2))
print(type(t3))

列表和元組的轉換

list(t) 將t轉換成list
tuple(t) 轉換成元組

t3 = ('a','b')
t3 = list(t3)
print(type(t3)) # list
t3 = tuple(t3)
print(type(t3)) # tuple

字典

當存儲的數據要動態添加、刪除的時候,我們一般使用列表,但是列表有時會遇到一些麻煩。就是在修改元素的時候,需要找到元素的下標才能進行修改
使用字典,用鍵值對 的形式,對元素進行存儲,可以通過直接訪問關鍵字來對元素進行修改,相當於java中的map形式

定義字典的格式:{鍵1:值1, 鍵2:值2, 鍵3:值3, …, 鍵n:值n}

info = {
'name':'班長', 'id':100, 'sex':'f', 'address':'地球亞洲中國上海'}
info['name'] # 字典使用鍵來獲取對應的值

鍵可以使用數字、布爾值、布爾值、元組等不可變數據類型,但是一般習慣使用字符串
每個字典裡的key都是唯一的,如果出現了多個key,後面的value會覆蓋前一個key對應的value
字典是沒有下標或者切片的

查看元素

直接用鍵查看或者使用get方法,
區別就是使用不存在的key獲取對應值,get方法會返回None,而前者會報錯;
get可以加默認值

info = {
'name':'班長','age':18}
print(info['age']) # 獲取年齡
# print(info['sex']) # 獲取不存在的key,會發生異常
print(info.get('sex')) # 獲取不存在的key,獲取到空的內容,不會出現異常。輸出結果為 None
print(info.get('sex', '男')) # 獲取不存在的key, 可以提供一個默認值。輸出結果為 男,但是默認值是不會對字典造成修改的

修改元素

直接通過鍵進行修改

添加元素

如果在使用 變量名[‘鍵’] = 數據 時,這個“鍵”在字典中,則覆蓋原來的值,即相當於修改元素,不存在,那麼就會新增這個元素

刪除元素

dict.clear() 清空

dict.pop(key) 根據鍵進行刪除,返回值是鍵對應的值
dict.popitem() 從後往前刪除

d = {
'name':'zs','age':'19'}
r = d.pop('name')
print(d)
print(r) # zs
d = {
'name':'zs','age':'19'}
r = d.popitem()
print(d) # {'name': 'zs'}
print(r) # ('age', '19')

del和pop一樣,也可以根據key刪除,也可以將整個字典刪除,會將變量也刪除

遍歷

for…in…直接遍歷,返回的是key

info = {
'name':'班長','age':18, 'sex':'man'}
for d in info:
print(d)
#####輸出
name
age
sex

獲取value,dict.values,輸出是一個特殊的列表

print(info.values())
#輸出: dict_values(['班長', 18, 'man'])

獲取key,dict.keys

print(info.keys())
# dict_keys(['name', 'age', 'sex'])

獲取字典中每一項,dict.items,輸出是列表套元組的結構

print(info.items())
# 輸出:dict_items([('name', '班長'), ('age', 18), ('sex', 'man')])
for k, v in info.items():
print('key:{},value:{}'.format(k, v))
## 輸出
key:name,value:班長
key:age,value:18
key:sex,value:man

setdefault,update,fromkeys

setdefault類似於添加,不常用,只能做添加,不能做修改
update可以將兩個字典合並

info.setdefault('a','b')
print(info)
# {'name': '班長', 'age': 18, 'sex': 'man', 'a': 'b'}
dict2 = {
'a':10}
info.update(dict2)
print(info) # {'name': '班長', 'age': 18, 'sex': 'man', 'a': 10}
print(dict2) # {'a': 10}

fromkeys創建一個新的字典,用類直接調用,傳遞的參數是一個可迭代的對象
輸出是一個創建的新的字典,其中key是傳遞的第一個參數列表中的值,value是第二個傳遞的參數
不常用

dict3 = dict.fromkeys(['a','b'],[10,20])
print(dict3) # {'a': [10, 20], 'b': [10, 20]}

集合set

集合(set)是一個無序的不重復元素序列,可以使用大括號 { } 或者 set() 函數創建集合。

注意:創建一個空集合必須用 set() 而不是 { },因為 { } 是用來創建一個空字典。

創建格式:

parame = {
value01,value02,...}
或者
set(value)

添加元素

set.add(x)
或者
s.update(x),可以添加元素,且參數可以是列表,元組,字典等

>>>set1 = set(("Google", "Runoob", "Taobao"))
>>> set1.update({
1,3})
>>> print(set1)
{
1, 3, 'Google', 'Taobao', 'Runoob'}
>>> set1.update([1,4],[5,6])
>>> print(set1)
{
1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}

刪除元素

s.remove(x)
如果刪除不存在的,會報錯

thisset = set(("Google", "Runoob", "Taobao"))
thisset.remove("Taobao")
print(thisset)
# {'Google', 'Runoob'}
thisset.remove("Facebook") # 不存在會發生錯誤
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Facebook'

s.discard(x)也是移除集合中的元素,且如果元素不存在,不會發生錯誤。格式如下所示:

thisset = set(("Google", "Runoob", "Taobao"))
thisset.discard("Facebook") # 不存在不會發生錯誤
print(thisset)
# {'Taobao', 'Google', 'Runoob'}

del可以直接刪除這個集合,刪除以後變量也不存在了
clear清空,仍然可以重新添加元素

set.pop() 隨機刪除集合中的任一元素

交集並集差集

可以用方法,也可以用符號

a = {
1,2,3,4,5}
b = {
4,5,6,7,8,9}
print(a.intersection(b)) # {4, 5}
print(a & b)
print(a.union(b)) # {1, 2, 3, 4, 5, 6, 7, 8, 9}
print(a|b)
print(a.difference(b)) # {1, 2, 3}
print(a- b)

其它補充

類型轉換

list–> tuple、set(長度可能轉變)
tuple–>set、list
set–>tuple、list

字典轉列表、元組、集合,只是轉換鍵

info = {
'name': '班長', 'age': 18, 'sex': 'man'}
print(list(info)) # ['name', 'age', 'sex']
print(tuple(info)) # ('name', 'age', 'sex')

列表、元組、集合一般不能轉換為字典
特殊情況下可以轉

list2 = [[1,2],[3,4]]
print(dict(list2)) # {1: 2, 3: 4}

帶下標的遍歷

可迭代對象都可以使用 enumerate 內置類進行包裝成一個 enumerate 對象。對enumerate進行遍歷,可以同時得到一個可迭代對象的下標和元素

nums = [12, 9, 8, 5, 4, 7, 3, 6]
# 將列表 nums 包裝成 enumerate 對象
for i, num in enumerate(nums): # i表示元素下標,num表示列表裡的元素
print('第%d個元素是%d' % (i, num))

針對可迭代對象的算數運算符

格式化輸出

除了使用format,也可以使用如下形式:
python的print字符串前面加f表示格式化字符串,加f後可以在字符串裡面使用用花括號括起來的變量和表達式,如果字符串裡面沒有表達式,那麼前面加不加f輸出應該都一樣.
格式化的字符串文字前綴為’f’和接受的格式字符串相似str.format()。它們包含由花括號包圍的替換區域。替換字段是表達式,在運行時進行評估,然後使用format()協議進行格式化。

特別注意內外引號要有區別

info = {
'name': '班長', 'age': 18, 'sex': 'man'}
print(f"name:{
info['name']}") # name:班長

公共方法

print() input() type() id() len()
bin() oct() hex()
chr() 給ascill碼轉字符
ord() 給字符轉ascill碼
max() min() sum() abs()
sorted() 可以給可迭代對象排序,返回一個列表,通過reverse=True變成降序


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved