05、Python 系列之--python list「列表」 、tuple「元組」 、 dictionary「字典」

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

PS:轉(zhuǎn)載請注明出處
作者: TigerChain
地址: http://www.lxweimin.com/p/351fa3464119
本文出自 TigerChain簡書 Python 系列

教程簡介

  • 1、閱讀對象

本篇教程適合新手閱讀,老手直接略過

正文

一、列表「list」

python 中的列表有以下特點:

  • 1、是一個有序集合
  • 2、通過下標(biāo)來索引,讀取數(shù)據(jù)
  • 3、支持嵌套
  • 4、是一個可變的類型

1、在 python 中,列表可以用來存放一組數(shù)據(jù),并且這些數(shù)據(jù)類型是可以不一樣的「這和 java c 不同」

格式如下:

列表名 = [xxx,xxx,xxx,...]

比如:names = ["TigerChain","XiaoHua","ZhangSan"] 就是定義了一個名字列表

2、輸出列表

列表類似于 JS 中的數(shù)組,數(shù)組就會有下標(biāo),我們可以根據(jù)下標(biāo)輸出每個列表的值

demo1:輸出姓名列表的值

# 定義一個姓名列表
names = ["TigerChain","XiaoHua","ZhangSan"]
# 輸出每個列表的值
# 以下是 python2 中的輸出,python3 的輸出是 print()
print names[0]
print names[1]
print names[2]

運行查看結(jié)果:

? python 01、列表「list」.py
TigerChain
XiaoHua
ZhangSan

我們可以看到,利用下標(biāo)我們輸出了列表的值

3、列表長度 len() 函數(shù)

我知道在 java 中數(shù)組是有長度的,同理 python 中的列表也是有長度的,我們通過 len(list) 就可以獲取列表的長度,拿到長度我們不是就可以遍歷了嗎???「由于 python 中的 for 循環(huán)的特殊性,我們不拿到長度照樣可以遍歷」

demo2:遍歷輸出姓名列表

names = ["TigerChain","XiaoHua","ZhangSan"]

print("列表的長度是:%d"%len(names))

# 遍歷輸出
for name in names:
    print name

運行輸出結(jié)果:

? python 01、列表「list」.py
列表的長度是:3
TigerChain
XiaoHua
ZhangSan

我們剛才上面說了 len 函數(shù)是返回列表的長度,for 循環(huán)中遍歷用不到它,但是我非要用 len 遍歷,你能把我雜的,那么我們使用 while 來遍歷不就得了,修改上面的代碼

demo3:使用 while 循環(huán)輸出姓名列表

names = ["TigerChain","XiaoHua","ZhangSan"]

size = len(names)
i = 0
while i<size:
    print(names[i])
    i+=1
# 輸出結(jié)果和 demo1 是一樣的

4、列表的一些常見方法

  • 1、append

list.append(obj) :在列表的末尾添加新的對象

demo1:在已有姓名列表中添加 WangWu

# -*- coding:UTF-8 -*-
names = ["TigerChain","XiaoHua","ZhangSan"]
print("append 之前的列表:%s"%names)
names.append("WangWu")
print("append 之后的列表:%s"%names)

運行查看結(jié)果

? python 02、append、extends、insert.py
append 之前的列表:['TigerChain', 'XiaoHua', 'ZhangSan']
append 之后的列表:['TigerChain', 'XiaoHua', 'ZhangSan', 'WangWu']
  • 2、insert

list.insert(index, obj):將對象插入到列表中「可以插在指定位置」

demo2:在姓名列表第 2 個位置插入 LiSi

names = ["TigerChain","XiaoHua","ZhangSan"]
print("insert 之前的列表:%s"%names)
# 因為下標(biāo)是從 0 開始,所以這里 1 就是第 2 個位置
names.insert(1,"LiSi")
print("insert 之后的列表:%s"%names)

運行查看結(jié)果

? python 02、append、extends、insert.py
insert 之前的列表:['TigerChain', 'XiaoHua', 'ZhangSan']
insert 之后的列表:['TigerChain', 'LiSi', 'XiaoHua', 'ZhangSan']
  • 3、extend

list.extend(seq):將另一個列表一次性追加到列表的末尾

demo3:將兩個班級里合并成一個班級「按姓名」

names1 = ["TigerChain","XiaoHua","ZhangSan"]
names2 = ["LiSi","WangWu","ZhaoLiu"]
print("1 班的同學(xué)們:%s"%names1)
print("2 班的同學(xué)們:%s"%names2)
names1.extend(names2)
print("extend 之后合成一個班:%s"%names1)

運行查看結(jié)果:

? python 02、append、extends、insert.py
1 班的同學(xué)們:['TigerChain', 'XiaoHua', 'ZhangSan']
2 班的同學(xué)們:['LiSi', 'WangWu', 'ZhaoLiu']
extend 之后合成一個班:['TigerChain', 'XiaoHua', 'ZhangSan', 'LiSi', 'WangWu', 'ZhaoLiu']
  • 4、sort 和 reverse

sort([func]):func 是可選參數(shù),如果設(shè)置了就按該參數(shù)的方法進行排序,否則就按默認(rèn)的順序進行排序「從小到大」

demo1:把全班成績按從小到大順序排列出來,并找出 80 分以上的成績

# 成績
scores = [60,54,80,99,45,79,26,72,76,75,88,89,95]
# 定義一個空列表用下存大于 80 分成績
youxiu = []
print("未排序之前的成績:%s "%scores)
scores.sort()
print("排序之后的成績:%s "%scores)
for score in scores:
    if(score>=80):
        youxiu.append(score)
print("全班達到 80 分以上部共有 %d 個 %s "%(len(youxiu),youxiu))

運行查看結(jié)果:

? python 03、sort\ 和\ reverse.py
未排序之前的成績:[60, 54, 80, 99, 45, 79, 26, 72, 76, 75, 88, 89, 95]
排序之后的成績:[26, 45, 54, 60, 72, 75, 76, 79, 80, 88, 89, 95, 99]
全班達到 80 分以上部共有 5 個 [80, 88, 89, 95, 99]

demo2:demo2:把全班的成績按從大到小排序

在這里我們使用 sort(reverse=True)

scores = [60,54,80,99,45,79,26,72,76,75,88,89,95]
scores.sort(reverse=True)
print("成績按從大小到排序結(jié)果是: %s "%scores)

運行查看結(jié)果:

? python 03、sort\ 和\ reverse.py
成績按從大小到排序結(jié)果是: [99, 95, 89, 88, 80, 79, 76, 75, 72, 60, 54, 45, 26]

除了數(shù)字排序,字符串也可以排序,按 ASCII 碼來排序「首字母,首字母一樣,按次字母,依次類推」

demo3:把名字按從小到大排序

names = ["Air","Beta","Beab","Dock","Coder","Zy","Higer"]
print("原來的順序:%s"%names)
names.sort()
print("按從小到大的排序:%s"%names)

運行查看結(jié)果:

? python 03、sort\ 和\ reverse.py
原來的順序:['Air', 'Beta', 'Beab', 'Dock', 'Coder', 'Zy', 'Higer']
按從小到大的排序:['Air', 'Beab', 'Beta', 'Coder', 'Dock', 'Higer', 'Zy']

reverse:反向列表中的數(shù)據(jù)

demo4:全班成績反向排序

scores = [60,90,87,56,43,88]
print("反向排序之前的成績:%s"%scores)
scores.reverse()
print("反向排序之后的成績:%s"%scores)

運行查看結(jié)果:

? python 03、sort\ 和\ reverse.py
反向排序之前的成績:[60, 90, 87, 56, 43, 88]
反向排序之后的成績:[88, 43, 56, 87, 90, 60]
  • 5、pop 和 remove

list.pop(obj=list[-1]):默認(rèn)移除列表最后一個元素

demo1:移除姓名列表中最后一個名字

names = ["ZhangSan","LiSi","WangWu"]
print("移除之前的姓名列表:%s"%names)
names.pop()
print("移除之后的姓名列表:%s"%names)

運行查看結(jié)果:

? python 04、pot和remove.py
移除之前的姓名列表:['ZhangSan', 'LiSi', 'WangWu']
移除之后的姓名列表:['ZhangSan', 'LiSi']

demo2:刪除指定位置的姓名

names = ["ZhangSan","LiSi","WangWu"]
print("移除之前的姓名列表:%s"%names)
names.pop(1)
print("移除之后的姓名列表:%s"%names)

運行查看結(jié)果:

? python 04、pot和remove.py
移除之前的姓名列表:['ZhangSan', 'LiSi', 'WangWu']
移除之后的姓名列表:['ZhangSan', 'WangWu']

remove(obj):用于刪除與列表中某個值的第一個匹配項

demo3:輸入你想要刪除的姓名「前提是列表中有」

names = ["TigerChain","ZhangSan","Lisi","WangWu","ZhaoLiu"]
print("列出所有的名字:%s "%names)
input_name = raw_input("輸入你想要刪除的名字:")
for name in names:
    if(name==input_name):
        names.remove(name)
print("刪除之后名字列表:%s"%names)

運行查看結(jié)果:

列出所有的名字:['TigerChain', 'ZhangSan', 'Lisi', 'WangWu', 'ZhaoLiu']
輸入你想要刪除的名字:WangWu
刪除之后名字列表:['TigerChain', 'ZhangSan', 'Lisi', 'ZhaoLiu']

通過上面我們知道我們可以對列表進行增、刪、改、查

二、tuple「元組」

1、元組定義

元組和列表在結(jié)構(gòu)上沒有什么區(qū)別,唯一的區(qū)別就是元組是只讀的,不能修改「即不能增、刪、改」是不可變類型,元組使用 "()" 來表示

demo1:定義一個姓名元組,并且遍歷出每個值

names = ("ZhangSan","LiSi","WangWu","ZhaoLiu")
print(names)
for name in names:
    print("我是:%s "%name)

運行查看結(jié)果:

? python 05、tuple元組.py
('ZhangSan', 'LiSi', 'WangWu', 'ZhaoLiu')
我是:ZhangSan
我是:LiSi
我是:WangWu
我是:ZhaoLiu

demo2:計算 ZhangSan 在姓名元組中出現(xiàn)在次數(shù)

names = ["ZhangSan","LiSi","ZhangSan","WangWu","ZhangSan"]
# 把一個列表轉(zhuǎn)化成元組使用 tuple 方法
new_names = tuple(names)
print(new_names)
print("張三出現(xiàn)的次數(shù):%d"%new_names.count('ZhangSan'))

運行查看結(jié)果:

? python 05、tuple元組.py
('ZhangSan', 'LiSi', 'ZhangSan', 'WangWu', 'ZhangSan')
張三出現(xiàn)的次數(shù):3

demo3:修改元組組 LiSi 為 ZhaoLiu

names = ["ZhangSan","LiSi","ZhangSan","WangWu","ZhangSan"]
new_names = tuple(names)
# 嘗試修改 LiSi 為 ZhaoLiu
new_names[1] = "ZhaoLiu"
print new_names

運行查看結(jié)果:

? python 05、tuple元組.py
Traceback (most recent call last):
  File "05、tuple元組.py", line 27, in <module>
    new_names[1] = "ZhaoLiu"
TypeError: 'tuple' object does not support item assignment

掛了,這就驗證了我們開始說的,元組是不能修改的「增、刪、改」

2、元組的內(nèi)置函數(shù)

方法 描述
cmp(tuple1, tuple2) 比較兩個元素,大于返回 1,小于返回 -1,等于返回 0
len(tuple) 計算元組中元素的個數(shù)
max(tuple) 返回元組最大的值
min(tuple) 返回元組中最小的值
tuple(seq) 將列表轉(zhuǎn)化成元組

大家可以嘗試一下,這些方法,這里就不說了

三、字典「dictionary」

1、概述

通過前面的學(xué)習(xí),我們知道 list「列表」 是一個可變類型的容器「支持增、刪、改、查」,并且里面可以存放任意類型的對象,那么字典「dictionary」也是一樣,是一個可變類型的容器,可以存放個任意類型的對象,不過字典存的是鍵值對。

字典這個東西,非常形象,我們?nèi)绻龅揭粋€不會的字,通常會去查字典,那么拼音「或部首」查字法,都是一一對應(yīng)的,一個拼音對應(yīng)一個字

在 python 中字典類似于 java 中的 hashmap ,js 中的 json

字典是Python語言中唯一的映射類型,映射類型對象里哈希值(鍵,key)和指向的對象(值,value)是一對多的的關(guān)系,通常被認(rèn)為是可變的哈希表。

2、格式

dic = {key1:value1,key2:value2,key3:value3,...}

使用一個 {} 來把字典包起來,鍵值之間使用 : 來分隔,每個鍵值對之間使用 , 來分隔。字典中 key 是唯一的,但是是值可以不必

demo1:按照拼音查找字

dic = {"zhangsan":"張三","lisi":"李四","piaoliang":"漂亮"}

print(dic['zhangsan'])
print(dic['lisi'])
print(dic['piaoliang'])

運行查看結(jié)果:

? python 06、dic字典.py
張三
李四
漂亮

demo2:修改字典中的 age

xiaoli = {"name":"xiaoli","age":22,"address":"中國陜西"}
print("小李錯誤的年齡:%d"%xiaoli["age"])
# 修改年齡
xiaoli["age"] = 23
print("小李的年齡修改為:%d"%xiaoli["age"])

運行查看結(jié)果:

? python 06、dic字典.py
小李錯誤的年齡:22
小李的年齡修改為:23

3、字典的遍歷

  • 1、遍歷 key

格式:

dic = {"key1":"value1":"key2":"value2",...}
for key in dic.keys():
    print key

demo3:遍歷輸出字典中的 key 值

TigerChain = {"name":"TigerChain","age":18,"address":"中國陜西","love":["看書","游泳","爬山"]}
for key in TigerChain.keys():
    print("TigerChain 字典中的key:%s"%key)

以上例子說明了字典中的數(shù)據(jù)可以是任意類型的

運行查看結(jié)果:

? python 06、dic字典.py
TigerChain 字典中的key:age
TigerChain 字典中的key:love
TigerChain 字典中的key:name
TigerChain 字典中的key:address
  • 2、遍歷 values

格式:

dic = {"key1":"value1":"key2":"value2",...}
for value in dic.values():
    print value

demo4:遍歷字典中的 所有的 values

dict = {"name":"zhangsan","age":18,"height":"165CM"}
print dict
for value in dict.values():
    print("dict 字典中的 value: %s"%value

運行查看結(jié)果:

? python 06、dic字典.py
{'age': 18, 'name': 'zhangsan', 'height': '165CM'}
dict 字典中的 value: 18
dict 字典中的 value: zhangsan
dict 字典中的 value: 165CM

demo5:修改字典中某個 key 所對應(yīng)的值

dict = {"name":"zhangsan","age":18,"height":"165CM"}
print("修改之前的字典:%r"%dict)
dict["name"] = "junjun"
print("修改之后的字典:%r"%dict) 
  • 3、字典內(nèi)置方法
方法 描述
dict.clear() 刪除字典里所有的元素
dict.copy() 返回一個字典的淺拷貝
dict.fromkeys(seq[, val])) 創(chuàng)建一個新字典,以序列 seq 中元素做字典的鍵,val 為字典所有鍵對應(yīng)的初始值
dict.get(key, default=None) 返回指定鍵的值,如果值不在字典中返回default值
dict.has_key(key) 如果鍵在字典dict里返回true,否則返回false
dict.items() 以列表返回可遍歷的(鍵, 值) 元組數(shù)組
dict.keys() 以列表返回一個字典所有的鍵
dict.update(dict2) 把字典dict2的鍵/值對更新到dict里
dict.values() 以列表返回字典中的所有值
pop(key[,default]) 刪除字典給定鍵 key 所對應(yīng)的值,返回值為被刪除的值。key值必須給出。 否則,返回default值。
popitem() 隨機返回并刪除字典中的一對鍵和值。

其余的方法就演示了,大家可以自行嘗試

demo 一個比較綜合的例子,模擬一個注冊,登錄,和查詢的例子,當(dāng)輸入 r 時就是注冊,輸入 l 時就是登錄,注冊成功以后,可以看到存起來的用戶名和密碼「用戶名和密碼拿字典來存」其中姓名是鍵,密碼是值

# -*- coding:utf-8 -*-

# 定義一個空字典
dic = {}
# 登錄或注冊的標(biāo)志
flag = 'r'
# 查詢的標(biāo)志
search = 'r'
# 注冊的標(biāo)志
register = 'r'
# 登錄的標(biāo)志
login = 'r'
# 退出的標(biāo)志
exit = 'r'

while flag == 'r' or 'l':
    flag = raw_input("注冊或登錄?r/l: ")
    # 注冊
    if flag == 'r':
        prompt = "添加用戶名:"
        uname = raw_input(prompt)
        upass = raw_input("添加密碼:")
        dic[str(uname)] = str(upass)
        print("注冊成功")

        search = raw_input("是否要查詢已注冊的用戶?s/e:")
        if(search=='s'):
            print dic
        else:
            continue
        # 登錄
    elif flag == 'l':
         loginUname = raw_input("輸入用戶名:")
         loginPass = raw_input("輸入密碼:")
         for key in dic.keys():
             if(str(loginUname) == key and dic[key] == str(loginPass)):
                 print("歡迎 %s 登錄"%key)
                 exit = 'q'
                 break
             else:
                 exit = 'e'
         if exit =='e':
             print("用戶名或密碼錯誤")
        #  登錄成功退出
         elif exit=='q':
             break
    else:
        print("輸入錯誤")
        break

運行查看結(jié)果:

dic_login.gif

到此為止列表、元組和字典就說完了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容