1. 程式人生 > >python 基礎第七篇

python 基礎第七篇

發現 判斷 考試 去掉 list去重 王健林 第七篇 有序列表 深度拷貝

一. 補充基礎數據類型的相關知識點

  1. str. join() 把列表變成字符串
  2. 列表不能再循環的時候刪除. 因為索引會跟著改變
  3. 字典也不能直接循環刪除.把要刪除的內容記錄在列表中. 循環列表. 刪除原列表, 字典中的數據
  4. fromkeys() 不會對原來的字典產生影響. 產生新字典(神坑, 考試)
  5. set集合. 不重復, 無序.
  6. 想轉換成什麽.就用什麽括起來
  7. 深淺拷貝
  • 直接賦值. 兩個變量指向同一個對象.
  • 淺拷貝:只拷貝第一層內容. copy()
  • 深度拷貝: 對象中的所有內容都會被拷貝一份

import copy
copy.deepcopy()

07. 萬惡之源-set集合,深淺拷貝以及部分知識點補充


本節主要內容:

  1. 基礎數據類型補充
  2. set集合
  3. 深淺拷?

主要內容:
?. 基礎數據類型補充
?先關於int和str在之前的學習中已經講了80%以上了. 所以剩下的??看?看就可以了.
我們補充給?個字符串基本操作

s = "corn".join(["王者榮耀","LOL",‘CS‘,‘DOTA‘,‘魔獸世界‘])
print(s)

列表:
循環刪除列表中的每?個元素

技術分享圖片
lst = [‘周傑倫‘,‘周潤發‘,‘周星星‘,‘馬化騰‘,‘周樹人‘]
l = []
for i in lst:
    if i.startswith("周"):
        l.append(i)
for i in l:
    lst.remove(i)
print(lst)
技術分享圖片

註意: 由於刪除元素會導致元素的索引改變, 所以容易出現問題. 盡量不要再循環中直接去刪 除元素. 可以把要刪除的元素添加到另?個集合中然後再批量刪除.

字典同上:

技術分享圖片
# 字典也不能在循環的時候更改大小
dic = {"a":"123", "b":"456"}
for k in dic:
    dic.setdefault("c", "123")

a = dict.fromkeys(["jj", ‘jay‘, ‘taibai‘], "sb")  # 靜態方法


dic = {"a":"123"}
s = dic.fromkeys("王健林", "思聰" ) # 返回給你一個新字典
print(s)
技術分享圖片

類型轉換:
元組 => 列表 list(tuple)
列表 => 元組 tuple(list)
list=>str str.join(list)
str=>list str.split()
轉換成False的數據:
0,‘‘,None,[],(),{},set() ==> False

?. set集合
set集合是python的?個基本數據類型. ?般不是很常?. set中的元素是不重復的.?序的.?
?的元素必須是可hash的(int, str, tuple,bool), 我們可以這樣來記. set就是dict類型的數據但
是不保存value, 只保存key. set也?{}表?
註意: set集合中的元素必須是可hash的, 但是set本?是不可hash得. set是可變的.

set1 = {‘1‘,‘alex‘,2,True,[1,2,3]} # 報錯
set2 = {‘1‘,‘alex‘,2,True,{1:2}} # 報錯
set3 = {‘1‘,‘alex‘,2,True,(1,2,[2,3,4])} # 報錯

set中的元素是不重復的, 且?序的.

s = {"周傑倫", "周傑倫", "周星星"}
print(s)
# 結果:
# {‘周星星‘, ‘周傑倫‘}

使?這個特性.我們可以使?set來去掉重復

# 給list去重復
lst = [45, 5, "哈哈", 45, ‘哈哈‘, 50]
lst = list(set(lst)) # 把list轉換成set, 然後再轉換回list
print(lst)

set集合增刪改查
1. 增加

技術分享圖片
s = {"劉嘉玲", ‘關之琳‘, "王祖賢"}
s.add("鄭裕玲")
print(s)
s.add("鄭裕玲") # 重復的內容不會被添加到set集合中
print(s)
s = {"劉嘉玲", ‘關之琳‘, "王祖賢"}
s.update("麻花藤") # 叠代更新
print(s)
s.update(["張曼?", "李若彤","李若彤"])
print(s)
技術分享圖片

2. 刪除

技術分享圖片
s = {"劉嘉玲", ‘關之琳‘, "王祖賢","張曼?", "李若彤"}
item = s.pop() # 隨機彈出?個.
print(s)
print(item)
s.remove("關之琳") # 直接刪除元素
# s.remove("??疼") # 不存在這個元素. 刪除會報錯
print(s)
s.clear() # 清空set集合.需要註意的是set集合如果是空的. 打印出來是set() 因為要和dict區分的.
print(s) # set()
技術分享圖片

3. 修改

技術分享圖片
# set集合中的數據沒有索引. 也沒有辦法去定位?個元素. 所以沒有辦法進?直接修改.
# 我們可以采?先刪除後添加的?式來完成修改操作
s = {"劉嘉玲", ‘關之琳‘, "王祖賢","張曼?", "李若彤"}
# 把劉嘉玲改成趙本?
s.remove("劉嘉玲")
s.add("趙本?")
print(s)
技術分享圖片

4. 查詢

# set是?個可叠代對象. 所以可以進?for循環
for el in s:
 print(el)

5. 常?操作

技術分享圖片
s1 = {"劉能", "趙四", "???"}
s2 = {"劉科?", "馮鄉?", "???"}
# 交集
# 兩個集合中的共有元素
print(s1 & s2) # {‘???‘}
print(s1.intersection(s2)) # {‘???‘}
# 並集
print(s1 | s2) # {‘劉科?‘, ‘馮鄉?‘, ‘趙四‘, ‘???‘, ‘劉能‘}
print(s1.union(s2)) # {‘劉科?‘, ‘馮鄉?‘, ‘趙四‘, ‘???‘, ‘劉能‘}
# 差集
print(s1 - s2) # {‘趙四‘, ‘劉能‘} 得到第?個中單獨存在的
print(s1.difference(s2)) # {‘趙四‘, ‘劉能‘}
# 反交集
print(s1 ^ s2) # 兩個集合中單獨存在的數據 {‘馮鄉?‘, ‘劉能‘, ‘劉科?‘, ‘趙四‘}
print(s1.symmetric_difference(s2)) # {‘馮鄉?‘, ‘劉能‘, ‘劉科?‘, ‘趙四‘}
s1 = {"劉能", "趙四"}
s2 = {"劉能", "趙四", "???"}
# ?集
print(s1 < s2) # set1是set2的?集嗎? True
print(s1.issubset(s2))
# 超集
print(s1 > s2) # set1是set2的超集嗎? False
print(s1.issuperset(s2))
技術分享圖片

set集合本?是可以發?改變的. 是不可hash的. 我們可以使?frozenset來保存數據. frozenset是不可變的. 也就是?個可哈希的數據類型

s = frozenset(["趙本?", "劉能", "???", "?跪"])
dic = {s:‘123‘} # 可以正常使?了
print(dic)

這個不是很常?. 了解?下就可以了

三. 深淺拷?

技術分享圖片
lst1 = ["??獅王", "紫衫?王", "?眉鷹王", "?翼蝠王"]
lst2 = lst1
print(lst1)
print(lst2)
lst1.append("楊逍")
print(lst1)
print(lst2)
#結果:
[‘??獅王‘, ‘紫衫?王‘, ‘?眉鷹王‘, ‘?翼蝠王‘, ‘楊逍‘]
[‘??獅王‘, ‘紫衫?王‘, ‘?眉鷹王‘, ‘?翼蝠王‘, ‘楊逍‘]
dic1 = {"id": 123, "name": "謝遜"}
dic2 = dic1
print(dic1)
print(dic2)
dic1[‘name‘] = "範瑤"
print(dic1)
print(dic2)
#結果:
{‘id‘: 123, ‘name‘: ‘謝遜‘}
{‘id‘: 123, ‘name‘: ‘謝遜‘}
{‘id‘: 123, ‘name‘: ‘範瑤‘}
{‘id‘: 123, ‘name‘: ‘範瑤‘}
技術分享圖片

對於list, set, dict來說, 直接賦值. 其實是把內存地址交給變量. 並不是復制?份內容. 所以. lst1的內存指向和lst2是?樣的. lst1改變了, lst2也發?了改變

淺拷?

技術分享圖片
lst1 = ["何炅", "杜海濤","周渝?"]
lst2 = lst1.copy()
lst1.append("李嘉誠")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
#結果:
#兩個lst完全不?樣. 內存地址和內容也不?樣. 發現實現了內存的拷?
lst1 = ["何炅", "杜海濤","周渝?", ["麻花藤", "?蕓", "周筆暢"]]
lst2 = lst1.copy()
lst1[3].append("?敵是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
#結果:
[‘何炅‘, ‘杜海濤‘, ‘周渝?‘, [‘麻花藤‘, ‘?蕓‘, ‘周筆暢‘, ‘?敵是多磨寂寞‘]]
[‘何炅‘, ‘杜海濤‘, ‘周渝?‘, [‘麻花藤‘, ‘?蕓‘, ‘周筆暢‘, ‘?敵是多磨寂寞‘]]
4417248328 4417248328
技術分享圖片

淺拷?. 只會拷?第?層. 第?層的內容不會拷?. 所以被稱為淺拷?

深拷?

技術分享圖片
import copy
lst1 = ["何炅", "杜海濤","周渝?", ["麻花藤", "?蕓", "周筆暢"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("?敵是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
#結果:
[‘何炅‘, ‘杜海濤‘, ‘周渝?‘, [‘麻花藤‘, ‘?蕓‘, ‘周筆暢‘, ‘?敵是多磨寂寞‘]]
[‘何炅‘, ‘杜海濤‘, ‘周渝?‘, [‘麻花藤‘, ‘?蕓‘, ‘周筆暢‘]]
4447221448 4447233800
技術分享圖片

都不?樣了. 深度拷?. 把元素內部的元素完全進?拷?復制. 不會產??個改變另?個跟著改變的問題

補充?個知識點:

最後我們來看?個?試題:

a = [1, 2]
a[1] = a
print(a[1])

作業;

一.判斷一個數是否是水仙花數, 水仙花數是一個三位數, 三位數的每一位的三次方
的和還等於這個數. 那這個數就是一個水仙花數, 例如: 153 = 1**3 + 5**3 + 3**3
技術分享圖片
h = 0
s = input("請隨機輸入一個三位數:")
for i in s:
    h = h + int(i) ** 3
if h == int(s):
    print(‘這是水仙花數‘)
else:
    print("不是水仙花數")
技術分享圖片
二.給出一個純數字列表. 請對列表進行排序(升級題).
思路:
1.完成a和b的數據交換. 例如, a = 10, b = 24 交換之後, a = 24, b = 10
2.循環列表. 判斷a[i]和a[i+1]之間的大小關系, 如果a[i]比a[i+1]大. 則進行互換.
循環結束的時候. 當前列表中最大的數據就會被移動到最右端.
3.想一想, 如果再次執行一次上面的操作. 最終第二大的數據就移動到了右端. 以此類推.
如果反復的進行執行相應的操作. 那這個列表就變成了一個有序列表.
ls = [10, 12, 32, 45, 88, 5, 96, 58, 3, 45]
for i in range(1, len(ls)):
    for j in range(0,len(ls)-i):
        if ls[j] > ls[j+1]:
            ls[j], ls[j+1] = ls[j+1], ls[j]
print(ls)

三.完成彩票36選7的功能. 從36個數中隨機的產生7個數. 最終獲取到7個不重復的數據作為最終的開獎結果.
隨機數:
from random import randint
randint(0, 20) # 0 - 20 的隨機數

from random import randint
s = set()
a = 1
while int(len(s)) < 7:
    s.add(randint(1, 36))
print(s)
四. 稅務部門征收所得稅. 規定如下: 
1). 收入在2000以下的. 免征.
2). 收入在2000-4000的, 超過2000部分要征收3%的稅.
3). 收入在4000-6000的, 超過4000部分要征收5%的稅.
4). 收入在6000-10000的, 超過6000部分要征收8%的稅.
4). 收入在10000以上的, 超過部分征收20%的稅.
註, 如果一個人的收入是8000, 那麽他要交2000到4000的稅加上4000到6000的稅加上6000到8000的稅.
收入 = 8000-(4000-2000)*3%-(6000-4000)*4%-(8000-6000)*8%
讓用戶輸入它的工資, 計算最終用戶拿到手是多
技術分享圖片
s = float(input(‘請輸入你的工資:‘))
if s <= 2000:
    print("你最終的工資為:%s" % s)
elif s > 2000 and s <= 4000:
    a = s - (s - 2000)*0.03
    print("你最終的工資為:%s" % a)
elif s > 4000 and s <= 6000:
    a = s - (s - 4000)*0.05-(4000-2000)*0.03
    print("你最終的工資為:%s" % a)
elif s >6000 and s <= 8000:
    a = s - (s - 6000)*0.08-(6000-4000)*0.05-(4000-2000)*0.03
    print("你最終的工資為:%s" % a)
else:
    a = s - (s - 8000)*0.2-(8000-6000)*0.08-(6000-4000)*0.05-(4000-2000)*0.03
    print("你最終的工資為:%s" % a)

python 基礎第七篇