Python入門篇(四)之字符串、字典、集合
字符串是無法修改的,只能作為查詢.
在python中,加了引號的字符就是字符串類型,python並沒有字符類型。
定義:name=‘kim‘ #name=str(‘kim‘)
用於標識:描述性的內容,如姓名,性別,國籍,種族
那單引號、雙引號、多引號有什麽區別呢? 讓我大聲告訴你,單雙引號木有任何區別,只有下面這種情況 你需要考慮單雙的配合msg = "My name is Kim , I‘m 18 years old!"
多引號什麽作用呢?作用就是多行字符串必須用多引號
msg = ‘‘‘<br/>今天我想寫首小詩,<br/>歌頌我的同桌,<br/>你看他那烏黑的短發,<br/>好像一只炸毛雞。<br/>‘‘‘ <br/>print(msg)
#!/usr/bin/python # _*_ coding:utf-8 _*_ # Aothr: Kim name = ‘my name is {name} and i am {years} old‘ print(name.capitalize()) #首字母大寫 ==>執行結果:My name is {name} and i am {years} old print(name.count("a")) #統計字母a的個數 =>執行結果:5 print(name.center(50,"-")) #統計50個字符,不夠以-湊足,美觀打印 =>執行結果:------my name is {name} and i am {years} old------ print(name.endswith("x")) #判斷字符串是否以什麽結尾,比如判斷郵件地址是否以.com結尾,返回布爾值 =>執行結果:False print(name.expandtabs(tabsize=30)) #tab鍵轉換成多少個空格 =>執行結果: print(name.find("name")) #查找字符返回的是索引,name在my name....(m-->0,y-->1......) =>執行結果:3 print(name[name.find("y"):]) #字符串切片,打印y到最後 =>執行結果:y name is {name} and i am {years} old print(name.format(name=‘alex‘,years=‘23‘)) #格式 =>執行結果:my name is alex and i am 23 old print(name.format_map( {‘name‘:‘alex‘,‘years‘:12} )) #嵌入字典 =>執行結果:my name is alex and i am 23 old print(name.index("and")) #取索引 =>執行結果:18 print(‘ab123‘.isalnum()) #判斷是否是阿拉伯數字 =>執行結果:True print(‘abA‘.isalpha()) =>執行結果:True print(‘1.22‘.isdecimal()) #判斷十進制 =>執行結果:False print(‘1A‘.isdigit()) #判斷是否數字 =>執行結果:False print(‘222‘.isidentifier()) #判斷是不是一個合法的標識符,或者是否是一個合法的變量 =>執行結果:False print(‘a‘.islower()) #判斷是否小寫 =>執行結果:True print(‘2AAA‘.isupper() #判斷是否大寫 =>執行結果:False print(‘+‘.join( [‘1‘,‘2‘,‘3‘]) ) =>執行結果:1+2+3 print( name.ljust(50,‘*‘) ) #統計50個字符,不夠用*在右側湊足 =>執行結果:my name is {name} and i am {years} old************ print( name.rjust(50,‘-‘) ) #統計50個字符,不夠用-在左側湊足 =>執行結果:------------my name is {name} and i am {years} old print(‘Alex‘.lower()) #大寫變小寫 =>執行結果:alex print(‘Alex‘.upper()) #小寫變大寫 =>執行結果:ALEX print(‘\nAlex‘.lstrip()) #去掉左邊換行符 =>執行結果:Alex print(‘Alex\n‘.rstrip()) #去掉右邊換行符 =>執行結果:Alex print(‘ Alex\n‘.strip()) #去掉換行和空格符 =>執行結果:Alex p = str.maketrans("abcdef","123456") #類似加密,需要對齊(a-->1,b-->2,c-->3,以此類推) print("alex li".translate(p)) =>執行結果:1l5x li print(‘alex li‘.replace(‘l‘,‘L‘,1)) #替換 =>執行結果:aLex li print(‘alex li‘.rfind(‘l‘)) #找到最右邊的值,返回下標 =>執行結果:5 print(‘al ex lil‘.split(‘l‘)) #以l作為分隔符 =>執行結果:[‘a‘, ‘ ex ‘, ‘i‘, ‘‘] print(‘1+2+3+4‘.split(‘\n‘)) #以換行符分隔 =>執行結果:[‘1+2+3+4‘] print(‘1+2\n+3+4‘.splitlines()) #識別換行符分隔 =>執行結果:[‘1+2‘, ‘+3+4‘] print(‘Alex Li‘.swapcase()) #大寫變小寫,小寫變大寫 =>執行結果:aLEX lI print(‘alex li‘.title()) #變成主題 =>執行結果:Alex Li print(‘alex li‘.zfill(50)) #沒啥卵用 =>執行結果:0000000000000000000000000000000000000000000alex li
2、字典操作
字典是一種key-value的數據類型,使用就想我們上學使用的字典,通過筆畫、字母來差對應頁的詳細內容。字典可以嵌套列表
在{}內用逗號分隔,可以存放多個key:value的值,value可以是任意類型
定義:
info={‘name‘:‘egon‘,‘age‘:18,‘sex‘:18}
info=dict({‘name‘:‘egon‘,‘age‘:18,‘sex‘:18})
用於標識:存儲多個值的情況,每個值都有唯一一個對應的key,可以更為方便高效地取值
2.1、語法:
info = { ‘stu1101‘:"Zhang san" ‘stu1102‘:"Li si" ‘stu1103‘:"Wang wu" } print(info) print(info["stu1101"]) #取值 執行結果: {‘stu1102‘: ‘Li si‘, ‘stu1103‘: ‘Wang wu‘, ‘stu1101‘: ‘Zhang san‘} Zhang san
2.2、字典的特性:
(1)dict是無序的,因為字典沒有下標,也不需要下標。
(2)key必須是唯一的,so,天生去重
字典如下:
info = {
‘stu1101‘:"Zhang san"
‘stu1102‘:"Li si"
‘stu1103‘:"Wang wu"
}
2.3、字典的操作
(1)增加
info[‘stu1104‘] = "KIM"
print(info)
執行結果:
{‘stu1101‘: ‘Zhang san‘, ‘stu1104‘: ‘KIM‘, ‘stu1103‘: ‘Wang wu‘, ‘stu1102‘: ‘Li si‘}
(2)修改
info[‘stu1101‘] = "Grace"
print(info)
執行結果:
{‘stu1102‘: ‘Li si‘, ‘stu1103‘: ‘Wang wu‘, ‘stu1104‘: ‘KIM‘, ‘stu1101‘: ‘Grace‘}
(3)刪除
del info["stu1101"]
info.pop("stu1101") #標準刪除姿勢
info.popitem() #隨機刪除
print(info)
執行結果:
{‘stu1103‘: ‘Wang wu‘, ‘stu1102‘: ‘Li si‘}
(4)查找
print("stu1102" in info) #查找stu1102是否在info字典中
執行結果:True
print(info.get("stu1101")) #獲取
print(info["stu1101"]) #和get方法是一樣的,但是如果key不存在,就會報錯,get不會,不存在只會返回none
執行結果:
Zhang san
Zhang san
print(info.get(‘stu1106‘))
執行結果:None
print(info["stu1106"])
執行結果:KeyError: ‘stu1106‘
(5)多級字典嵌套及操作
av_catalog = {
"歐美":{
"www.youporn.com": ["很多免費的,世界最大的","質量一般"],
"www.pornhub.com": ["很多免費的,也很大","質量比yourporn高點"],
"letmedothistoyou.com": ["多是自拍,高質量圖片很多","資源不多,更新慢"],
"x-art.com":["質量很高,真的很高","全部收費,屌比請繞過"]
},
"日韓":{
"tokyo-hot":["質量怎樣不清楚,個人已經不喜歡日韓範了","聽說是收費的"]
},
"大陸":{
"1024":["全部免費,真好,好人一生平安","服務器在國外,慢"]
}
}
av_catalog["大陸"]["1024"][1] = "北京歡迎你" #更改
print(av_catalog)
執行結果:
{‘大陸‘: {‘1024‘: [‘全部免費,真好,好人一生平安‘, ‘北京歡迎你‘]}, ‘歐美‘: {‘letmedothistoyou.com‘: [‘多是自拍,高質量圖片很多‘, ‘資源不多,更新慢‘], ‘x-art.com‘: [‘質量很高,真的很高‘, ‘全部收費,屌比請繞過‘], ‘www.pornhub.com‘: [‘很多免費的,也很大‘, ‘質量比yourporn高點‘], ‘www.youporn.com‘: [‘很多免費的,世界最大的‘, ‘質量一般‘]}, ‘日韓‘: {‘tokyo-hot‘: [‘質量怎樣不清楚,個人已經不喜歡日韓範了‘, ‘聽說是收費的‘]}}
av_catalog["大陸"]["1024"][1] += ",可以使用爬蟲" #增加內容
print(av_catalog["大陸"]["1024"]) #只打印大陸--1024內容
執行結果:
[‘全部免費,真好,好人一生平安‘, ‘北京歡迎你,可以使用爬蟲‘]
(6)其他操作
info = {
‘stu1101‘:"Zhang san",
‘stu1102‘:"Li si",
‘stu1103‘:"Wang wu",
}
(1)values
print(info.values()) #打印所有的value
執行結果:dict_values([‘Li si‘, ‘Zhang san‘, ‘Wang wu‘])
(2)keys
print(info.keys()) #打印所有的key
執行結果:dict_keys([‘stu1103‘, ‘stu1102‘, ‘stu1101‘])
(3)setdefault 在字典中取值,如果能取到直接返回,如果無法取到值,則會進行創建增加。
info.setdefault("stu1106","Alex") #增加鍵值對
print(info)
執行結果:{‘stu1102‘: ‘Li si‘, ‘stu1103‘: ‘Wang wu‘, ‘stu1106‘: ‘Alex‘, ‘stu1101‘: ‘Zhang san‘}
info.setdefault("stu1102","Alex")
print(info)
執行結果:{‘stu1101‘: ‘Zhang san‘, ‘stu1102‘: ‘Li si‘, ‘stu1103‘: ‘Wang wu‘}
(4)update
info = {
‘stu1101‘:"Zhang san",
‘stu1102‘:"Li si",
‘stu1103‘:"Wang wu",
}
b = {
"stu1104":"xiaoqiang",
1:2,
3:4
}
info.update(b) #將b字典合並到info字典中
print(info)
執行結果:{‘stu1103‘: ‘Wang wu‘, 3: 4, ‘stu1102‘: ‘Li si‘, 1: 2, ‘stu1101‘: ‘Zhang san‘, ‘stu1104‘: ‘xiaoqiang‘}
(5)items
print(info.items()) #打印出鍵值對
執行結果:
dict_items([(‘stu1102‘, ‘Li si‘), (‘stu1101‘, ‘Zhang san‘), (‘stu1103‘, ‘Wang wu‘)])
(7)循環字典dict
方法一:
info = {
‘stu1101‘:"Zhang san",
‘stu1102‘:"Li si",
‘stu1103‘:"Wang wu",
}
for i in info:
print(i,info[i])
執行結果:
stu1101 Zhang san
stu1102 Li si
stu1103 Wang wu
方法二:
for k,v in info.items(): #會先把dict轉成list,數據裏大時莫用
print(k,v)
執行結果:
stu1102 Li si
stu1103 Wang wu
stu1101 Zhang san
2.4、程序練習
程序: 三級菜單
要求:
1.打印省、市、縣三級菜單
2.可返回上一級
3.可隨時退出程序
很low的程序,只是練習而已,別當真~!
#!/usr/bin/python
# _*_ coding:utf-8 _*_
# Aothr: Kim
info = {
"廣東省":{
"中山市":{
"東區":["威尼斯","行政中心"],
"南區":["樹木園","中澳花園"],
"西區":["汽車站","劍橋郡"]},
"廣州市":{
"天河區":["珠江新城","天河客運站"],
"花都區":["培正學院","廣州北站"],
}
},
"福建省":{
"廈門市":{
"廈門":["鼓浪嶼","廈門大學"]}
},
"湖南省":{
"長沙市":{
"長沙":["臭豆腐專賣店","鳳凰古城"],}
}
}
exit_flag = False #增加標誌位
while True:
for i in info:
print(i)
province = input("請輸入你想要去的省份:")
if province in info:
while True:
for i2 in info[province]:
print("\t", i2)
city = input("如需返回請上級菜單請輸入b,退出請按q,請選擇地市:")
if city in info[province]:
while True:
for i3 in info[province][city]:
print("\t\t", i3)
area = input("如需返回請上級菜單請輸入b,退出請按q,請選擇區域:")
if area in info[province][city]:
while True:
for i4 in info[province][city][area]:
print(i4)
site = input("如需返回上級菜單請按b,退出請按q,請選擇地點:")
if site in info[province][city][area]:
print("正在為你選擇合適路線......\n導航開始")
back = input("最後一級菜單,可按b返回上一級菜單,退出請按q:")
if back == "b":
pass
elif back == "q":
exit()
elif site == ‘q‘:
exit()
elif site == ‘b‘:
break
else:
print("你的輸入錯誤,請重新輸入:")
elif area == ‘q‘:
exit()
elif area == ‘b‘:
break
else:
print("你的輸入錯誤,請重新輸入:")
elif city == ‘q‘:
exit()
elif city == ‘b‘:
break
else:
print("你的輸入錯誤,請重新輸入:")
elif province == ‘q‘:
exit()
else:
print("你的輸入錯誤,請重新輸入:")
購物車程序優化:
用戶入口:
1、商品信息存在文件裏
2、已購商品,余額記錄
用戶入口:
1、可以添加商品,修改商品價格
3、集合操作
集合是一個無序的,不重復的數據組合,它的主要作用如下:
去重,把一個列表變成集合,就自動去重了
關系測試,測試兩組數據之前的交集、差集、並集等關系
3.1、集合去重功能
list_1 = [1,4,5,7,3,6,7,9] -->列表中有重復的值
list_1 = set(list_1)-->設置成集合
print(list_1,type(list_1)) -->去除了重復的7
執行結果:{1, 3, 4, 5, 6, 7, 9} <class ‘set‘>
3.2、關系測試
list_1 = [1,4,5,7,3,6,7,9]
list_1 = set(list_1)
list_2 =set([2,6,0,66,22,8,4])
#交集
print(list_1.intersection(list_2))
print(list_1 & list_2) -->符號表示法,使用“&”符號
執行結果:{4, 6}
#並集
print(list_1.union(list_2))
print(list_1 | list_2) -->符號表示法,使用“|”符號
執行結果:{0, 1, 2, 3, 4, 5, 6, 7, 66, 9, 8, 22}
#差集,in list_1 but not in list_2
print(list_1.difference(list_2))
print(list_2.difference(list_1))
print(list_1 - list_2) -->符號表示法,使用“-”符號
print(list_2 - list_1)
執行結果:
{1, 3, 5, 9, 7}
{0, 8, 2, 66, 22}
#子集和父集
list_3=set([1,3,7])
print(list_3.issubset(list_1)) -->判斷list_3是否為list_1的子集
print(list_1.issuperset(list_2)) -->判斷list_1是否為list_2的父集
執行結果:True False
#對稱差集
list_1 = set([1,4,5,7,3,6,7,9])
list_2 =set([2,6,0,66,22,8,4])
print(list_1.symmetric_difference(list_2)) -->相當於去重後的並集
print(list_1 ^ list_2) -->符號表示法,使用“^”符號
執行結果:{0, 1, 2, 66, 3, 5, 7, 8, 9, 22}
#判斷集合是否有交集
list_3=set([1,3,7])
list_4 = set([5,6,8,7])
print(list_3.isdisjoint(list_4))
執行結果:True
3.3、基本操作
(1)添加一項
list_1 = set([1,4,5,7,3,6,7,9])
print(list_1.add(999))
執行結果:{1, 3, 4, 5, 6, 7, 999, 9}
(2)添加多項
print(list_1.update([888,777,555]))
執行結果:{1, 3, 4, 5, 6, 7, 9, 777, 555, 888}
(3)刪除項,remove刪除不存在的項時會報錯,使用discard不會報錯
list_1.remove(888) --->方法一
list_1.discard(888) --->方法二
print(list_1)
執行結果:{1, 3, 4, 5, 6, 7, 9, 777, 555}
list_1.remove(89999)
執行結果:KeyError: 89999
(4)隨機刪除
list_1 = set([{1, 3, 4, 5, 6, 7, 9, 777, 555, 888}])
print(list_1.pop()) #隨機刪除
print(list_1.pop())
print(list_1.pop())
執行結果:
1
3
4
(5)set的長度
list_1 = set([{1, 3, 4, 5, 6, 7, 9, 777, 555, 888}])
print(len(list_1))
執行結果:10
(6)判斷x是否是s的成員
list_1 = set([{1, 3, 4, 5, 6, 7, 9, 777, 555, 888}])
print(666 in list_1)
print(666 not in list_1)
執行結果:
False
True
(7)復制
list_1 = set([{1, 3, 4, 5, 6, 7, 9, 777, 555, 888}])
list_9 = list_1.copy()
print(list_9)
執行結果:{1, 3, 4, 5, 6, 7, 9, 777, 555, 888}
參考鏈接:金角大王
Python入門篇(四)之字符串、字典、集合