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

版权声明:本文为博主原创文章,未经博主允许不得转载。

PS:转载请注明出处
作者: TigerChain
地址: http://www.jianshu.com/p/351fa3464119
本文出自 TigerChain简书 Python 系列

教程简介

  • 1、阅读对象

本篇教程适合新手阅读,老手直接略过

正文

一、列表「list」

python 中的列表有以下特点:

  • 1、是一个有序集合
  • 2、通过下标来索引,读取数据
  • 3、支持嵌套
  • 4、是一个可变的类型

1、在 python 中,列表可以用来存放一组数据,并且这些数据类型是可以不一样的「这和 java c 不同」

格式如下:

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

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

2、输出列表

列表类似于 JS 中的数组,数组就会有下标,我们可以根据下标输出每个列表的值

demo1:输出姓名列表的值

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

运行查看结果:

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

我们可以看到,利用下标我们输出了列表的值

3、列表长度 len() 函数

我知道在 java 中数组是有长度的,同理 python 中的列表也是有长度的,我们通过 len(list) 就可以获取列表的长度,拿到长度我们不是就可以遍历了吗???「由于 python 中的 for 循环的特殊性,我们不拿到长度照样可以遍历」

demo2:遍历输出姓名列表

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

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

# 遍历输出
for name in names:
    print name

运行输出结果:

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

我们刚才上面说了 len 函数是返回列表的长度,for 循环中遍历用不到它,但是我非要用 len 遍历,你能把我杂的,那么我们使用 while 来遍历不就得了,修改上面的代码

demo3:使用 while 循环输出姓名列表

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

size = len(names)
i = 0
while i<size:
    print(names[i])
    i+=1
# 输出结果和 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)

运行查看结果

▶ 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)
# 因为下标是从 0 开始,所以这里 1 就是第 2 个位置
names.insert(1,"LiSi")
print("insert 之后的列表:%s"%names)

运行查看结果

▶ 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 班的同学们:%s"%names1)
print("2 班的同学们:%s"%names2)
names1.extend(names2)
print("extend 之后合成一个班:%s"%names1)

运行查看结果:

▶ python 02、append、extends、insert.py
1 班的同学们:['TigerChain', 'XiaoHua', 'ZhangSan']
2 班的同学们:['LiSi', 'WangWu', 'ZhaoLiu']
extend 之后合成一个班:['TigerChain', 'XiaoHua', 'ZhangSan', 'LiSi', 'WangWu', 'ZhaoLiu']
  • 4、sort 和 reverse

sort([func]):func 是可选参数,如果设置了就按该参数的方法进行排序,否则就按默认的顺序进行排序「从小到大」

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))

运行查看结果:

▶ 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("成绩按从大小到排序结果是: %s "%scores)

运行查看结果:

▶ python 03、sort\ 和\ reverse.py
成绩按从大小到排序结果是: [99, 95, 89, 88, 80, 79, 76, 75, 72, 60, 54, 45, 26]

除了数字排序,字符串也可以排序,按 ASCII 码来排序「首字母,首字母一样,按次字母,依次类推」

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

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

运行查看结果:

▶ python 03、sort\ 和\ reverse.py
原来的顺序:['Air', 'Beta', 'Beab', 'Dock', 'Coder', 'Zy', 'Higer']
按从小到大的排序:['Air', 'Beab', 'Beta', 'Coder', 'Dock', 'Higer', 'Zy']

reverse:反向列表中的数据

demo4:全班成绩反向排序

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

运行查看结果:

▶ 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]):默认移除列表最后一个元素

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

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

运行查看结果:

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

demo2:删除指定位置的姓名

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

运行查看结果:

▶ 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)

运行查看结果:

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

通过上面我们知道我们可以对列表进行增、删、改、查

二、tuple「元组」

1、元组定义

元组和列表在结构上没有什么区别,唯一的区别就是元组是只读的,不能修改「即不能增、删、改」是不可变类型,元组使用 "()" 来表示

demo1:定义一个姓名元组,并且遍历出每个值

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

运行查看结果:

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

demo2:计算 ZhangSan 在姓名元组中出现在次数

names = ["ZhangSan","LiSi","ZhangSan","WangWu","ZhangSan"]
# 把一个列表转化成元组使用 tuple 方法
new_names = tuple(names)
print(new_names)
print("张三出现的次数:%d"%new_names.count('ZhangSan'))

运行查看结果:

▶ python 05、tuple元组.py
('ZhangSan', 'LiSi', 'ZhangSan', 'WangWu', 'ZhangSan')
张三出现的次数:3

demo3:修改元组组 LiSi 为 ZhaoLiu

names = ["ZhangSan","LiSi","ZhangSan","WangWu","ZhangSan"]
new_names = tuple(names)
# 尝试修改 LiSi 为 ZhaoLiu
new_names[1] = "ZhaoLiu"
print new_names

运行查看结果:

▶ 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、元组的内置函数

方法 描述
cmp(tuple1, tuple2) 比较两个元素,大于返回 1,小于返回 -1,等于返回 0
len(tuple) 计算元组中元素的个数
max(tuple) 返回元组最大的值
min(tuple) 返回元组中最小的值
tuple(seq) 将列表转化成元组

大家可以尝试一下,这些方法,这里就不说了

三、字典「dictionary」

1、概述

通过前面的学习,我们知道 list「列表」 是一个可变类型的容器「支持增、删、改、查」,并且里面可以存放任意类型的对象,那么字典「dictionary」也是一样,是一个可变类型的容器,可以存放个任意类型的对象,不过字典存的是键值对。

字典这个东西,非常形象,我们如果遇到一个不会的字,通常会去查字典,那么拼音「或部首」查字法,都是一一对应的,一个拼音对应一个字

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

字典是Python语言中唯一的映射类型,映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表。

2、格式

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

使用一个 {} 来把字典包起来,键值之间使用 : 来分隔,每个键值对之间使用 , 来分隔。字典中 key 是唯一的,但是是值可以不必

demo1:按照拼音查找字

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

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

运行查看结果:

▶ python 06、dic字典.py
张三
李四
漂亮

demo2:修改字典中的 age

xiaoli = {"name":"xiaoli","age":22,"address":"中国陕西"}
print("小李错误的年龄:%d"%xiaoli["age"])
# 修改年龄
xiaoli["age"] = 23
print("小李的年龄修改为:%d"%xiaoli["age"])

运行查看结果:

▶ 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)

以上例子说明了字典中的数据可以是任意类型的

运行查看结果:

▶ 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

运行查看结果:

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

demo5:修改字典中某个 key 所对应的值

dict = {"name":"zhangsan","age":18,"height":"165CM"}
print("修改之前的字典:%r"%dict)
dict["name"] = "junjun"
print("修改之后的字典:%r"%dict) 
  • 3、字典内置方法
方法 描述
dict.clear() 删除字典里所有的元素
dict.copy() 返回一个字典的浅拷贝
dict.fromkeys(seq[, val])) 创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值
dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值
dict.has_key(key) 如果键在字典dict里返回true,否则返回false
dict.items() 以列表返回可遍历的(键, 值) 元组数组
dict.keys() 以列表返回一个字典所有的键
dict.update(dict2) 把字典dict2的键/值对更新到dict里
dict.values() 以列表返回字典中的所有值
pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
popitem() 随机返回并删除字典中的一对键和值。

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

demo 一个比较综合的例子,模拟一个注册,登录,和查询的例子,当输入 r 时就是注册,输入 l 时就是登录,注册成功以后,可以看到存起来的用户名和密码「用户名和密码拿字典来存」其中姓名是键,密码是值

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

# 定义一个空字典
dic = {}
# 登录或注册的标志
flag = 'r'
# 查询的标志
search = 'r'
# 注册的标志
register = 'r'
# 登录的标志
login = 'r'
# 退出的标志
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

运行查看结果:

dic_login.gif

到此为止列表、元组和字典就说完了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容