008 列表list[]、元组tuple()、字典dict{}、集合set[]、字符串

 本节内容

  • 列表list []
  • 元组tuple () 只读
  • 字典dict {} 键值对
  • 集合set []无序、去重
  • 字符串
  • 作业(多级菜单)

一、列表list[]

列表属性

  • 切片:取多个元素 names[1:4]
  • 追加 names.append("我是新来的")
  • 插入 names.insert(5,"从eric后面插入试试新姿势")
  • 修改 names[2] = "该换人了"
  • 删除 del names[2]
  • 扩展 names.extend(b)
  • 拷贝 name_copy = names.copy()
  • 统计 names.count("Amy")
  • 排序&翻转 names.sort() 、names.reverse()
  • 获取下标 names.index("Amy")

 创建列表:

name_list = ['dream', 'seven', 'eric']
或
name_list = list(['dream', 'seven', 'eric'])

基本操作:索引、切片、追加、删除、长度、切片、循环、包含

 

# 打印列表的索引号的序号:
f=[3,1,4,5,6,2,8,9]
for index,line in enumerate(f):
    print(index,line)

 

二、元组tuple(只读列表)()

元组tuple用小括号()表示,与列表的区别在于:

1)元组不可以直接修改

2)元组含有列表大部分方法,除append、extend、insert

3)元组可以用小括号或不用括号表示,t=('a','b')和t='a','b'  一样

4)为只读列表,它只有2个方法,一个是count,一个是index。

创建元组:

ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))

 

三、字典dict{}

特征: 

  1. 特性:
  2. 无顺序
  3. 去重
  4. 查询速度快,比列表快多了
  5. 比list占用内存多

创建字典:

person = {"name": "mr.wu", 'age': 18}
或
person = dict({"name": "mr.wu", 'age': 18})

 

bob ={"firstName":"Robert","lastName":"Smith","age":19}
print(bob["firstName"],bob["lastName"],"is",bob["age"],"years old.")

PhoneNum={"Sam":2345678,"Ted":5436666,"Joe":4443456}
name=input("Enter a person's name:")
print(name + "'s phone number is",PhoneNum[name])

band={6:"six","instrument":"Tromnone",7:"seventy"}
print(band[7].capitalize()+'-'+band[6],band["instrument"]+"s")

常用操作:

  • 索引
  • 新增
  • 删除
  • 键、值、键值对
  • 循环
  • 长度

 

增加 info["stu1104"] = "苍井空"
修改 info['stu1101'] = "武藤兰"
删除 info.pop("stu1101") #标准删除姿势
  del info['stu1103'] #换个姿势删除
  info.popitem() #随机删除
查找 "stu1102" in info #标准用法
  info.get("stu1102") #获取
  info["stu1102"] #同上,但是看下面
  info["stu1105"] #如果一个key不存在,就报错,get不会,不存在只返回None


多级字典嵌套及操作: 

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"])
#ouput 
['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']

其它姿势

#values
>>> info.values()
dict_values(['LongZe Luola', 'XiaoZe Maliya'])

#keys
>>> info.keys()
dict_keys(['stu1102', 'stu1103'])


#setdefault
>>> info.setdefault("stu1106","Alex")
'Alex'
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
>>> info.setdefault("stu1102","龙泽萝拉")
'LongZe Luola'
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}


#update 
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
>>> b = {1:2,3:4, "stu1102":"龙泽萝拉"}
>>> info.update(b)
>>> info
{'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}

#items
info.items()
dict_items([('stu1102', '龙泽萝拉'), (1, 2), (3, 4), ('stu1103', 'XiaoZe Maliya'), ('stu1106', 'Alex')])


#通过一个列表生成默认dict,有个没办法解释的坑,少用吧这个
>>> dict.fromkeys([1,2,3],'testd')
{1: 'testd', 2: 'testd', 3: 'testd'}

循环dict 

#方法1
for key in info:
    print(key,info[key])

#方法2
for k,v in info.items(): #会先把dict转成list,数据里大时莫用
    print(k,v)

四、集合set(不允许重复)[]

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

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系

 

集合推导union、intersection、difference

set1={x * x for x in range(-5,4)}
set2={x * x for x in range(-3,3)}
print(set1,'\n',set2)
print(set1.union(set2))#set1和set2的并集
print(set1.intersection(set2))#set1和set2的交集
print(set1.difference(set2))#set1中排查与set2的交集

 

集合推导:{x * x for x in range(-3,3)}

集合操作方法add,discard,clear,set

words={"spam","ni"}
words.add("eggs")
print(words)
words.discard("ni") # 这里好像不能用{}
print(words)
words.clear()
print(words)
words=set([3,7,3])
print(words)
words=set((7,3,4,3))
print(words)
sorted(words,reverse=False)
print("sorted后:",words)

 

常用操作:

s = set([3,5,9,10])      #创建一个数值集合    
t = set("Hello")         #创建一个唯一字符的集合 


a = t | s          # t 和 s的并集    
b = t & s          # t 和 s的交集    
c = t – s          # 求差集(项在t中,但不在s中)    
d = t ^ s          # 对称差集(项在t或s中,但不会同时出现在二者中)     
  
基本操作:    
t.add('x')            # 添加一项    
s.update([10,37,42])  # 在s中添加多项       
  
使用remove()可以删除一项:  
t.remove('H')   
  
len(s)  set 的长度    
x in s  测试 x 是否是 s 的成员    
x not in s  测试 x 是否不是 s 的成员  
s.issubset(t) s
<= t 测试是否 s 中的每一个元素都在 t 中 s.issuperset(t) s >= t 测试是否 t 中的每一个元素都在 s 中 s.union(t) s | t 返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t) s & t 返回一个新的 set 包含 s 和 t 中的公共元素 s.difference(t) s - t 返回一个新的 set 包含 s 中有但是 t 中没有的元素 s.symmetric_difference(t) s ^ t 返回一个新的 set 包含 s 和 t 中不重复的元素 s.copy() 返回 set “s”的一个浅复制

 

五、字符串

在“009 数据类型及数据运算及格式化输出format ”章节再次介绍。https://www.cnblogs.com/wzh313/articles/9161610.html

字符串拼接:

  python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。

 字符串格式化输出 

name = "dream"
print("i am %s " % name)

PS: 字符串是 %s;整数 %d;浮点数%f

字符串常用功能:

 

#基础部分
name='dRe吴am'
print(name.capitalize())  #首字母大写
print(name.casefold())#大写全部变小写
print(name.center(50,"-"))#输出 '----------------------dReam-----------------------'
print(name.count('ea')) #统计ea出现次数
print(name.encode())#将字符串编码成bytes格式"b'dRe\xe5\x90\xb4am'"
print(name.endswith("am")) #判断字符串是否以am结尾
print("dRe\t吴am".expandtabs(10))#输出'dRe       吴am', 将\t转换成多长的空格
print(name.find('am'))#查找am,找到返回其索引, 找不到返回-1
name.index('a')  #返回a所在字符串的索引
'9aA'.isalnum()   #True
'9'.isdigit() #是否整数
print(name.isnumeric())
print(name.isprintable())
print(name.isspace())
print(name.istitle())
print(name.isupper())
print("|".join(['alex','jack','rain']))
print('alex|jack|rain')
# format和format_map
msg = "1my name is {}, and age is {}"
print(msg.format("Dream",21))
msg = "2my name is {1}, and age is {0}"
print(msg.format("Dream",21))
msg = "3my name is {name}, and age is {age}"
print(msg.format(age=21,name="Dream"))
msg = "4my name is {name}, and age is {age}"
print(msg.format_map({'name':'Dream','age':21}))


#maketrans
intab = "aeiou"  #This is the string having actual characters.
outtab = "12345" #This is the string having corresponding mapping character
trantab = str.maketrans(intab, outtab)
str = "this is string example....wow!!!"
str.translate(trantab)
print(intab)
print(outtab)
print(str)
print(str.translate(trantab))

msg = "my name is {}, and age is {}"
n4="Hello 2orld"
print(msg.partition('is')) #输出('my name ', 'is', ' {}, and age is {}')
print("Dream, chinese name is Memory".replace("ea","EA",1))

msg.swapcase #大小写互换
msg.zfill(40)
'00000my name is {name}, and age is {age}'
n4.ljust(40,"-")#'Hello 2orld-----------------------------'
n4.rjust(40,"-")#'-----------------------------Hello 2orld'
b="ddefdsdff_哈哈"
b.isidentifier() #检测一段字符串可否被当作标志符,即是否符合变量命名规则

 

六、作业(多级菜单)

作业:多级菜单

  • 三级菜单
  • 可依次选择进入各子菜单
  • 所需新知识点:列表、字典

例如:

  1. 打印省、市、县三级菜单
  2. 可返回上一级
  3. 可随时退出程序

 

menu = {
    '北京':{
        '海淀':{
            '五道口':{
                'soho':{},
                '网易':{},
                'google':{}
            },
            '中关村':{
                '爱奇艺':{},
                '汽车之家':{},
                'youku':{}
            },
            '上地':{
                '百度':{}
            },
        },
        '昌平':{
            '沙河':{
                '北航':{}
            },
            '天通苑':{},
            '回龙观':{}
        },
        '朝阳':{},
        '东城':{}
    },
    '上海':{
        '闵行':{
            "人民广场":{
                '炸鸡店':{}
            }
        },
        '闸北':{
            '火车战':{
                '携程':{}
            }
        },
        '浦东':{}
    },
    '山东':{}
}


exit_flag = False
current_layer = menu

layers = [menu]

while not  exit_flag:
    for k in current_layer:
        print(k)
    choice = input(">>:").strip()
    if choice == "b":
        current_layer = layers[-1]
        #print("change to laster", current_layer)
        layers.pop()
    elif choice not  in current_layer:continue
    else:
        layers.append(current_layer)
        current_layer = current_layer[choice]

 

posted @ 2018-06-09 21:54  航松先生  阅读(164)  评论(0)    收藏  举报