Day2-列表、字典、集合


Day2-列表、字典、集合

作者:Ago 

归档:学习笔记

2017/01/28

 

 

1.1 列表、元组操作

列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作

定义列表

  1 >>> name = ["Aige","Jackson","Tom"]
  2 
  3 >>> name
  4 
  5 ['Aige', 'Jackson', 'Tom']
  6 
  7 >>>
  8 
view code

通过下标访问列表中的元素,下标从0开始计数

  1 >>> name[0]
  2 
  3 'Aige'
  4 
  5 >>> name[1]
  6 
  7 'Jackson'
  8 
  9 >>> name[2]
 10 
 11 'Tom'
 12 
 13 >>> name[3] #没值就会报错
 14 
 15 Traceback (most recent call last):
 16 
 17 File "<stdin>", line 1, in <module>
 18 
 19 IndexError: list index out of range
 20 
 21 >>>
 22 
view code

切片:取多个元素

  1 >>> name = ["Aige","Jackson","Tom","Can","David"]
  2 
  3 >>> name[1:3] #取下标1至下标3之间的数字,包括1,不包括3
  4 
  5 ['Jackson', 'Tom']
  6 
  7 >>> name[1:-1] #取下标1至-1的值,不包括-1
  8 
  9 ['Jackson', 'Tom', 'Can']
 10 
 11 >>> name[0:3]
 12 
 13 ['Aige', 'Jackson', 'Tom']
 14 
 15 >>> name[:3] #如果是从头开始取,0可以忽略,跟上句效果一样
 16 
 17 ['Aige', 'Jackson', 'Tom']
 18 
 19 >>> name[3:] #如果想取最后一个,必须不能写-1,只能这么写
 20 
 21 ['Can', 'David']
 22 
 23 >>> name[3:-1] #这样-1就不会被包含了
 24 
 25 ['Can']
 26 
 27 >>> name[0::2] #后面的2是代表,每隔一个元素,就取一个
 28 
 29 ['Aige', 'Tom', 'David']
 30 
 31 >>> name[::2] #和上句效果一样
 32 
 33 ['Aige', 'Tom', 'David']
 34 
view code

追加

  1 >>> names = ["Aige","Jackson","Tom","Can","David"]
  2 
  3 >>> names.append("I am new friend")
  4 
  5 >>> names
  6 
  7 ['Aige', 'Jackson', 'Tom', 'Can', 'David', 'I am new friend']
  8 
  9 >>>
 10 
view code

插入

  1 >>> names
  2 
  3 ['Aige', 'Jackson', 'Tom', 'Can', 'David', 'I am new friend']
  4 
  5 >>> names.insert(2,"强行从Jackson后面插入")
  6 
  7 >>> names
  8 
  9 ['Aige', 'Jackson', '强行从Jackson后面插入', 'Tom', 'Can', 'David', 'I am new friend']
 10 
 11 >>>
 12 
view code

修改

  1 >>> names
  2 
  3 ['Aige', 'Jackson', '强行从Jackson后面插入', 'Tom', 'Can', 'David', 'I am new friend']
  4 
  5 >>> names[2]="谁叫你插的,走开"
  6 
  7 >>> names
  8 
  9 ['Aige', 'Jackson', '谁叫你插的,走开', 'Tom', 'Can', 'David', 'I am new friend']
 10 
 11 >>>
 12 
view code

删除

  1 >>> names
  2 
  3 ['Aige', 'Jackson', '谁叫你插的,走开', 'Tom', 'Can', 'David', 'I am new friend']
  4 
  5 >>> del names[2] #指定位置删除
  6 
  7 >>> names
  8 
  9 ['Aige', 'Jackson', 'Tom', 'Can', 'David', 'I am new friend']
 10 
 11 >>> names.remove("Tom") #指定元素删除
 12 
 13 >>> names
 14 
 15 ['Aige', 'Jackson', 'Can', 'David', 'I am new friend']
 16 
 17 >>> names.pop() #删除最后一个
 18 
 19 'I am new friend'
 20 
 21 >>> names
 22 
 23 ['Aige', 'Jackson', 'Can', 'David']
 24 
 25 >>>
 26 
view code

扩展

  1 >>> names
  2 
  3 ['Aige', 'Jackson', 'Can', 'David']
  4 
  5 >>> b = ["扩展","I am",1,2,3]
  6 
  7 >>> names.extend(b)
  8 
  9 >>> names
 10 
 11 ['Aige', 'Jackson', 'Can', 'David', '扩展', 'I am', 1, 2, 3]
 12 
 13 >>>
 14 
view code

拷贝

  1 >>> names = ["aige",["waihao","can"]]
  2 
  3 >>> names
  4 
  5 ['aige', ['waihao', 'can']]
  6 
  7 >>> names2 = names.copy() #浅COPY,只拷贝了一层
  8 
  9 >>> names2
 10 
 11 ['aige', ['waihao', 'can']]
 12 
 13 >>> names[0] = "AIGE"
 14 
 15 >>> names
 16 
 17 ['AIGE', ['waihao', 'can']]
 18 
 19 >>> names2
 20 
 21 ['aige', ['waihao', 'can']]
 22 
 23 >>> names[1][0] = "外号"
 24 
 25 >>> names
 26 
 27 ['AIGE', ['外号', 'can']]
 28 
 29 >>> names2
 30 
 31 ['aige', ['外号', 'can']]
 32 
 33 >>>
 34 
 35 import copy
 36 
 37 names4 = copy.copy(names)
 38 
 39 names[1] = "CAN"
 40 
 41 print(names,names4) #这个也是浅copy
 42 
 43 names5 = copy.deepcopy(names)
 44 
 45 names[0] = "哈哈"
 46 
 47 names[2][0] = "阿雷克斯"
 48 
 49 print(names,names5) #深copy 一般不用'''
 50 
view code

统计

  1 >>> count_list = [1,2,1,2,3,4,5,7,1,1,0]
  2 
  3 >>> count_list.count("1")
  4 
  5 0
  6 
  7 >>> count_list.count(1)
  8 
  9 4
 10 
 11 >>>
 12 
view code

排序和翻转

  1 >>> names = ["aige","Can","Jack","Tom"]
  2 
  3 >>> names
  4 
  5 ['aige', 'Can', 'Jack', 'Tom']
  6 
  7 >>> names.sort() #特别提醒,不同类型数据,不能排序
  8 
  9 >>> names
 10 
 11 ['Can', 'Jack', 'Tom', 'aige'] #按照ASCII排序
 12 
 13 >>> names.reverse()
 14 
 15 >>> names
 16 
 17 ['aige', 'Tom', 'Jack', 'Can']
 18 
 19 >>>
 20 
view code

获取下标(索引)

  1 >>> names
  2 
  3 ['aige', 'Tom', 'Jack', 'Can']
  4 
  5 >>> names.index("Jack")
  6 
  7 2
  8 
  9 >>>
 10 
view code

元组

元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表

语法

  1 names = ("Aige","jack","eric") #中括号换小括号,既是元组

1.2 字符串操作

特性:不可修改

  1 name = "my name is aige {names}"
  2 
  3 print(name.capitalize()) #首字母大写
  4 
  5 print(name.count("a")) #统计字母个数
  6 
  7 print(name.center(20,"-"))
  8 
  9 print(name.endswith("e")) #以什么结尾
 10 
 11 print(name.find("aige")) #字符的索引,字符串可以切片
 12 
 13 print(name.format(names="AIGE"))
 14 
 15 print(name.isalnum()) #包含英文字符和阿拉伯数字
 16 
 17 print(name.isalpha()) #纯英文字符
 18 
 19 print(name.isdigit()) #是不是整数
 20 
 21 print(name.isidentifier()) #判断是不是合法的标识符 是不是合法变量名
 22 
 23 print(name.islower())
 24 
 25 print(name.isnumeric()) #只有数字,不能有小数点
 26 
 27 print(name.istitle()) #每个字母开头大写
 28 
 29 print(name.isupper()) #大写
 30 
 31 print('+'.join(['1','2','3']))
 32 
 33 print( name.ljust(50,"*") ) #不够50字节用*号补上
 34 
 35 print( name.rjust(50,"@"))
 36 
 37 print( name.lower())
 38 
 39 print( name.upper())
 40 
 41 print( "\nalex\n".lstrip()) #去掉左边的空格和回车
 42 
 43 print( "\nalex\n".rstrip()) #去右边
 44 
 45 print("\n alex \n".strip()) #去两边
 46 
 47 p = str.maketrans("abcdef","123456")
 48 
 49 print("aige Zhang".translate(p)) #一一对应的换,有点类似shell:tr命令
 50 
 51 print("aige aige".replace("a","A")) #替换
 52 
 53 print("aige aige".replace("a","A",1)) #替换一个
 54 
 55 print("aige aige".rfind('e')) #找到最后一个被找到的地方
 56 
 57 print("bingo nice gogo".split()) #字符串转成列表
 58 
 59 print("bingo \n hahaha".splitlines()) #换行符换成列表
 60 
 61 print("aige".startswith("a"))
 62 
 63 print("Aige zhang".swapcase()) #大小写转换
 64 
 65 print("aige can".title())
 66 
 67 print("aige aige ".zfill(30))
 68 
view code

1.3 字典操作

字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。

语法:

  1 info = {
  2 
  3     'stu001':"aige", #键值和value对应关系
  4 
  5     'stu002':"can", #通过key查找value
  6 
  7     'stu003':"happy", #字典是无序
  8 
  9 }
 10 
view code

字典的特性:

l dict是无序的

l key必须是唯一的,so 天生去重

增加

  1 >>> names = {"stu001":"Aige","stu002":"Jack","stu003":"Tom"}
  2 
  3 >>> names
  4 
  5 {'stu001': 'Aige', 'stu002': 'Jack', 'stu003': 'Tom'}
  6 

修改

  1 >>> names["stu004"] = "新人"
  2 
  3 >>> names
  4 
  5 {'stu001': 'Aige', 'stu002': 'Jack', 'stu003': 'Tom', 'stu004': '新人'}
  6 
  7 >>> names["stu004"] = "已经认识了:张三"
  8 
  9 >>> names
 10 
 11 {'stu001': 'Aige', 'stu002': 'Jack', 'stu003': 'Tom', 'stu004': '已经认识了:张三'}
 12 

删除

  1 >>> names.pop("stu004")
  2 
  3 '已经认识了:张三'
  4 
  5 >>> names
  6 
  7 {'stu001': 'Aige', 'stu002': 'Jack', 'stu003': 'Tom'}
  8 
  9 >>> names
 10 
 11 {'stu001': 'Aige', 'stu002': 'Jack', 'stu003': 'Tom'}
 12 
 13 >>> del names["stu003"]
 14 
 15 >>> names
 16 
 17 {'stu001': 'Aige', 'stu002': 'Jack'}
 18 
 19 >>>
 20 
 21 >>> names
 22 
 23 {'stu001': 'Aige', 'stu002': 'Jack', 'stu003': 'Jack', 'stu004': 'Tom', 'stu005': 'Harry', 'stu006': 'HengYuansan'}
 24 
 25 >>> names
 26 
 27 {'stu001': 'Aige', 'stu002': 'Jack', 'stu003': 'Jack', 'stu004': 'Tom', 'stu005': 'Harry', 'stu006': 'HengYuansan'}
 28 
 29 >>> names.popitem() ##随机删
 30 
 31 ('stu006', 'HengYuansan')
 32 
 33 >>> names.popitem()
 34 
 35 ('stu005', 'Harry')
 36 
 37 >>> names.popitem()
 38 
 39 ('stu004', 'Tom')
 40 
 41 >>>
 42 
view code

查找

  1 >>> info = {'stu002': 'LongZe Luola', 'stu003': 'XiaoZe Maliya'}
  2 
  3 >>> "stu002" in info
  4 
  5 True
  6 
  7 >>> info.get("stu002") #没有key值也不会报错
  8 
  9 'LongZe Luola'
 10 
 11 >>> info["stu002"]
 12 
 13 'LongZe Luola'
 14 
 15 >>> info["stu004"] #没有key值就会报错
 16 
 17 Traceback (most recent call last):
 18 
 19 File "<stdin>", line 1, in <module>
 20 
 21 KeyError: 'stu004'
 22 
 23 >>> info.get("stu004")
 24 
 25 >>>
 26 
view code

多级字典嵌套及操作

  1 av_catalog = {
  2 
  3 "欧美":{
  4 
  5     "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
  6 
  7     "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
  8 
  9     "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
 10 
 11     "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
 12 
 13 },
 14 
 15 "日韩":{
 16 
 17     "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
 18 
 19 },
 20 
 21 "大陆":{
 22 
 23     "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
 24 
 25 }
 26 
 27 }
 28 
 29 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
 30 
 31 print(av_catalog["大陆"]["1024"])
 32 
 33 #ouput 
 34 
 35 ['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
 36 
 37 #嵌套了很多层 key尽量不写中文
 38 
 39 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
 40 
 41 print(av_catalog["大陆"]["1024"])
 42 
 43 #ouput['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
 44 
 45 print(av_catalog.values()) #打印所有得值 不包括key值
 46 
 47 print(av_catalog.keys()) #打印所有得key
 48 
 49 av_catalog.setdefault("taiwan",{"www.baidu.com":[1,2]}) #字典里有的不改变。没有的改变
 50 
 51 print(av_catalog)
 52 
 53 av_catalog.setdefault("taiwan",{"haha":[000]}) #字典里有
 54 
 55 print(av_catalog)
 56 
view code

程序练习

程序: 三级菜单

要求:

1. 打印省、市、县三级菜单

2. 可返回上一级

3. 可随时退出程序

  1 #!/usr/bin/env python
  2 # _*_ coding:utf-8 _*_
  3 
  4 menu = {
  5     '北京':{
  6         '海淀':{
  7             '五道口':{
  8                 'soho':{},
  9                 '网易':{},
 10                 'google':{}
 11             },
 12             '中关村':{
 13                 '爱奇艺':{},
 14                 '汽车之家':{},
 15                 'youku':{},
 16             },
 17             '上地':{
 18                 '百度':{},
 19             },
 20         },
 21         '昌平':{
 22             '沙河':{
 23                 '老男孩':{},
 24                 '北航':{},
 25             },
 26             '天通苑':{},
 27             '回龙观':{},
 28         },
 29         '朝阳':{},
 30         '东城':{},
 31     },
 32     '上海':{
 33         '闵行':{
 34             "人民广场":{
 35                 '炸鸡店':{}
 36             }
 37         },
 38         '闸北':{
 39             '火车战':{
 40                 '携程':{}
 41             }
 42         },
 43         '浦东':{},
 44     },
 45     '山东':{},
 46 }
 47 
 48 
 49 exit_flag = False
 50 current_layer = menu
 51 
 52 layers = [menu]
 53 
 54 while not  exit_flag:
 55     for k in current_layer:
 56         print(k)
 57     choice = input(">>:").strip()
 58     if choice == "b":
 59         current_layer = layers[-1]
 60         #print("change to laster", current_layer)
 61         layers.pop()
 62     elif choice not  in current_layer:continue
 63     else:
 64         layers.append(current_layer)
 65         current_layer = current_layer[choice]
view code

1.4 集合操作

集合是一个无序的,不重复的数据组合,它的主要作用如下:

l 去重,把一个列表变成集合,就自动去重了

l 关系测试,测试两组数据之前的交集、差集、并集等关系

常用操作

  1 list_1 = [1,2,3,1,2,4,5,6]
  2 
  3 list_2 = set(list_1)
  4 
  5 list_3 = set([1,2,3,4,8,9,0])
  6 
  7 print(list_2,type(list_2))
  8 
  9 print(list_3,type(list_3))
 10 
 11 print( list_2.intersection(list_3) ) #取交集
 12 
 13 print( list_2 & list_3) #交集
 14 
 15 #print( list_2.intersection_update(list_3)) #交集后给list_2赋值
 16 
 17 print( list_2.union(list_3) ) #取并集
 18 
 19 print( list_2 | list_3) #并集
 20 
 21 print( list_2.difference(list_3) ) #差集
 22 
 23 print( list_2 - list_3) #差集
 24 
 25 print( list_3.difference(list_2) ) #差集
 26 
 27 print( list_2.issubset(list_3)) #子集
 28 
 29 list_4 = set([1,2])
 30 
 31 print( list_4.issubset(list_1)) #4是1子集
 32 
 33 print( list_2.symmetric_difference(list_3)) #对称差集 ,去掉了合集
 34 
 35 print( list_2 ^ list_3) #对称差集
 36 
 37 list_5 = set([10,15])
 38 
 39 print(list_2.isdisjoint(list_5)) #没交集,返回True
 40 
 41 list_5.add(999) #添加
 42 
 43 print(list_5)
 44 
 45 list_2.remove(3) #没值会报错
 46 
 47 list_2.discard(3) #没值不会报错
 48 
view code

1.5 文件操作

对文件操作流程

1. 打开文件,得到文件句柄并赋值给一个变量

2. 通过句柄对文件进行操作

3. 关闭文件

现有文件如下

文件操作:

  1 #!/usr/bin/env python
  2 # _*_ coding:utf-8 _*_
  3 
  4 #data = open("aige",encoding="utf-8").read()
  5 # f = open("aige",encoding="utf-8")    #文件句柄,就是文件的内存对象
  6 # data = f.read()          #读到文件末尾
  7 # data2 = f.read()         #从末尾开始读。没有任何内容了
  8 # print(data)
  9 # print("-------------",data2)
 10 
 11 # f = open("aige2","w",encoding="utf-8")     #创建一个文件。覆盖之前的文件名了
 12 #
 13 # f.write("我爱北京天安门\n")
 14 # f.write("天安门上太阳升")
 15 
 16 
 17 # f = open("aige2","a",encoding="utf-8")    #追加    #也不能读
 18 # f.write("我爱北京天安门")
 19 # f.close()
 20 # f = open("aige",encoding="utf-8")
 21 # print(f.readline())                   #一行行的读
 22 # print(f.readline())
 23 # print(f.readline())
 24 # print(f.readline())
 25 # for i in range(5):
 26 #     print(f.readline())
 27 # print(f.readlines())                 #生成列表
 28 
 29 # for index,line in enumerate(f.readlines()):   # f.readlines()只适合读小文件     #取消打印第十行
 30 #     if index == 9:
 31 #         print("分割线----------------------")
 32 #         continue
 33 #     print(line.strip())
 34 # count = 0
 35 # for line in f:                                 #效率高,比上面的高,上面是先加载整个文件到内存,下面是读一行删一行
 36 #     count += 1
 37 #     if count == 10:
 38 #         print("----------------")
 39 #         continue
 40 #     print(line)
 41 # f = open("aige",encoding="utf-8")
 42 # print(f.tell())
 43 # f.read(5)
 44 # print(f.tell())
 45 # f.seek(0)
 46 # print(f.tell())
 47 # print(f.encoding)
 48 # print(f.fileno())         #返回文件编号
 49 # f.seekable()     #判断文件是否可以跳转
 50 # f.readable()    #判断文件是否可读
 51 # f.flush()      #刷     把内存的写入硬盘
 52 f = open("aige","a", encoding="utf-8")
 53 # f.seek(10)
 54 # f.truncate(100)   #截断    无论seek到哪,都是从头开始截
 55 f.close()
 56 
 57 
 58 
 59 
view code

打开文件的模式有:

r,只读模式(默认)。

w,只写模式。【不可读;不存在则创建;存在则删除内容;】

a,追加模式。【可读; 不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

r+,可读写文件。【可读;可写;可追加】

w+,写读

a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

rU

r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

rb

wb

ab

1.6 字符编码与转码

http://www.cnblogs.com/yuanchenqi/articles/5956943.html

posted @ 2017-05-29 16:03  汉克书  阅读(233)  评论(0编辑  收藏  举报