本节内容

  1. 列表、元组操作
  2. 字符串操作
  3. 字典操作

1. 列表、元组操作

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

定义列表

1

names = ['Kkk',"Tenglan",'Eric']

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

1

2

3

4

5

6

7

8

>>> names[0]

'Kkk'

>>> names[2]

'Eric'

>>> names[-1] #最后一个

'Eric'

>>> names[-2] #还可以倒着取

'Tenglan'

切片:取多个元素  包括左边不包括右边,(顾头不顾尾

>>> names = ["Kkk","Tenglan","Eric","Rain","Tom","Amy"]

>>> names[1:4]  #取下标1至下标4之间的数字,包括1,不包括4

['Tenglan', 'Eric', 'Rain']

>>> names[1:-1] #取下标1至-1的值,不包括-1

['Tenglan', 'Eric', 'Rain', 'Tom']

>>> names[0:3] #切片;

['Kkk', 'Tenglan', 'Eric']

>>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样

['Kkk', 'Tenglan', 'Eric']

>>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写

['Rain', 'Tom', 'Amy']

>>> names[3:-1] #这样-1就不会被包含了

['Rain', 'Tom']

>>> names[0::2] #后面的2是代表步长,每隔一个元素,就取一个

['Kkk', 'Eric', 'Tom']

>>> names[::2] #和上句效果一样

['Kkk', 'Eric', 'Tom']

 

追加

 >>> names

['Kkk', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']

>>> names.append("我是新来的")

>>> names

['Kkk', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']

 

插入

>>> names

['Kkk', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']

>>> names.insert(2,"强行从Eric前面插入")

>>> names

['Kkk', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']

 

>>> names.insert(5,"从eric后面插入试试新姿势")

>>> names

['Kkk', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']

 

修改

>>> names

['Kkk', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']

>>> names[2] = "该换人了"

>>> names

['Kkk', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']

 

删除

>>> del names[2]

>>> names

['Kkk', 'Tenglan', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']

>>> del names[4]

>>> names

['Kkk', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']

>>>

 

del names #删除整个列表

 

>>> names.remove("Eric") #删除指定元素

>>> names

['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新来的']

>>> names.pop() #默认删除列表最后一个值,也可输入下标,删除指定位置的元素

'我是新来的'

>>> names

['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy']

 

扩展

>>> names

['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy']

>>> b = [1,2,3]

>>> names.extend(b)

>>> names

['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]

 

拷贝

>>> names

['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]

 

>>> name_copy = names.copy()

>>> name_copy

['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]

 

eg.坑

names = ["1zhangsan","lisi","#wangwu",["kkk","yyy"],"danzong"]
name2 = names.copy()
print(names)
print(name2)
names[2] = "旦总"
names[3][0] = '李四'

print(names)
print(name2)

=================结果=============

['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '旦总', ['李四', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '#wangwu', ['李四', 'yyy'], 'danzong']

 

结论:列表的copy()为浅copy;它只会copy第一层的内容(独立克隆一份),超过一层的它会把内存地址拷贝过来;所以第二层会指向原来列表的第二层内容。

copy第二个列表只是第一个列表的引用而已。

eg.实例

import copy
person = ['name',['saving',100]] #例如联合账号,数组内为银行存款
'''
p1=copy.copy(person)
p2=person[:]
p3=person.copy()
p4=list(person)
'''
#copy
p1=person[:]
p2=person[:]

p1[0]='kkk'
p2[0]='fengjie'

p1[1][1]=50
print(p1)
print(p2)

===========结果======

['kkk', ['saving', 50]]

['fengjie', ['saving', 50]]

 

列表等于:

names = ["1zhangsan","lisi","#wangwu",["kkk","yyy"],"danzong"]
name2 = names

print(names)
print(name2)

names[2] = "旦总"
names[3][0] = '李四'

print(names)
print(name2)

==============结果====================

['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '旦总', ['李四', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '旦总', ['李四', 'yyy'], 'danzong']

列表的赋值相等,两个列表的内存相等,都指向同一块内存区域。

 

深COPY:(不常用,耗费内存空间)

import copy
names = ["1zhangsan","lisi","#wangwu",["kkk","yyy"],"danzong"]
#name2 = copy.copy(names) #copy,等同于 names2=names.copy()
name2 = copy.deepcopy(names) #copy,完全copy,不管第几层。

print(names)
print(name2)

names[2] = "旦总"
names[3][0] = '李四'

print(names)
print(name2)

===========结果===========

['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '旦总', ['李四', 'yyy'], 'danzong']

['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']

 

统计

>>> names

['Kkk', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]

>>> names.count("Amy")

2

 

排序&翻转

>>> names

['Kkk', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]

>>> names.sort() #排序(根据ASCII码进行排序)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: unorderable types: int() < str()   #3.0里不同数据类型不能放在一起排序了,擦

>>> names[-3] = '1'

>>> names[-2] = '2'

>>> names[-1] = '3'

>>> names

['Kkk', 'Amy', 'Amy', 'Tenglan', 'Tom', '1', '2', '3']

>>> names.sort()

>>> names

['1', '2', '3', 'Kkk', 'Amy', 'Amy', 'Tenglan', 'Tom']

 

>>> names.reverse() #反转

>>> names

['Tom', 'Tenglan', 'Amy', 'Amy', 'Kkk', '3', '2', '1']

 

获取下标

>>> names

['Tom', 'Tenglan', 'Amy', 'Amy', 'Kkk', '3', '2', '1']

>>> names.index("Amy")

2 #只返回找到的第一个下标

 

列表for循环

names = ["1zhangsan","lisi","#wangwu",["kkk","yyy"],"danzong"]

for i in names:
    print(i)

==========结果==============

1zhangsan

lisi

#wangwu

['kkk', 'yyy']

danzong

元组

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

语法

1

names = ("Kkk","jack","eric")

它只有2个方法,一个是count,一个是index,完毕。  

 

程序练习 

请写出以下程序。

程序:购物车程序

需求:

  1. 启动程序后,让用户输入工资,然后打印商品列表
  2. 允许用户根据商品编号购买商品
  3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 
  4. 可随时退出,退出时,打印已购买商品和余额

 

思路(流程图):

 

code:

 


good_list=[
    ("故事汇",20),("钢笔",15),("华为手机",3000),("笔记本电脑",6000),("64GB U",100)
    ] #产品列表
shopping_list=[] #购物列表

salary = input("Please input your salary:") #工资
if salary.isdigit(): #判断是否输入数字
   
salary = int(salary)
    while salary>0:
#方法1
#       for item in good_list:
#           print(good_list.index(item),item) #
通过下标来找

#
方法2
       
for index,item in enumerate(good_list):#使用枚举函数获取index、item
            print(index,item)
    #\033[32; str \033[0m  绿色字体显示 ;\033[31; str \033[0m 红色字体显示
    #\033[42; str \033[0m 
绿色底色 ;\033[41; str \033[0m 红色底色

       
user_choice = input("\033[32;1m请输入序号进行购买。您可以随时按'Q''q'键退出。\033[0m")#用户选择
       
if user_choice == 'Q'or user_choice == 'q':#退出
           
if len(shopping_list) == 0:#啥都没买
               
print("\033[32;1m欢迎再次光临,您并未购买任何商品。\033[0m")
            else:#买了东西
               
print("\033[32;1m欢迎再次光临。您购买的商品如下:\033[0m")
            for i in shopping_list:
                print(i)
            print("您的余额为:\033[31;1m %s\033[0m" %(salary))
            exit()
        elif user_choice.isdigit():
            user_choice = int(user_choice)
            if user_choice < len(good_list) and user_choice >= 0 :
                if salary >= good_list[user_choice][1]:
                    shopping_list.append(good_list[user_choice])
                    salary -= good_list[user_choice][1]
                    print(" \033[32;1m %s\033[0m 购买成功。目前可用余额为:\033[31;1m%s\033[0m" %(good_list[user_choice][0],salary))
                else:
                    print("\033[41;1m 对不起,您的余额不足,请挑选其他商品,按Q/q键退出.\033[0m")
            else:
                print("\033[31;1m product code [%s] is not exist,Please try again later!\033[0m " % user_choice)
        else:
            print("\033[31;1m invalid option,Please try again!\033[0m")
    else:
        print("\033[31;1m您的余额已经为零,请下次光临。您购买的商品如下:\033[0m")
        for i in shopping_list:
            print(i)
        if len(shopping_list) == 0:
            print("\033[31;1m您并未购买任何商品。\033[0m")
else:
    print("\033[31;1m Sorry,your input is not a number,Please try again!\033[0m")

 

 

2. 字符串操作   

特性:不可修改 

常用操作

name=“Kkk Li”

name.capitalize()  首字母大写

name.casefold()   大写全部变小写

name.center(50,"-")  输出 '---------------------Kkk Li----------------------'         #一共打五十个字符不够的用”-”补全

name.count('lex') 统计 lex出现次数

name.encode()  将字符串编码成bytes格式

name.endswith("Li")  判断字符串是否以 Li结尾

 "Kkk\tLi".expandtabs(10) 输出'Kkk      Li', 将\t转换成10个的空格

 name.find('A')  查找A,找到返回其索引, 找不到返回-1

 

format :

    >>> msg = "my name is {}, and age is {}"

    >>> msg.format("Kkk",22)

    'my name is Kkk, and age is 22'

    >>> msg = "my name is {1}, and age is {0}"

    >>> msg.format("Kkk",22)

    'my name is 22, and age is Kkk'

    >>> msg = "my name is {name}, and age is {age}"

    >>> msg.format(age=22,name="ale")

    'my name is ale, and age is 22'

format_map

    >>> msg.format_map({'name':'Kkk','age':22})

    'my name is Kkk, and age is 22'

 

 

msg.index('a')  返回a所在字符串的索引

'9aA'.isalnum()   True

 

'9'.isdigit() 是否整数

 "|".join(['Kkk','jack','rain'])

'Kkk|jack|rain'

 

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)

    'th3s 3s str3ng 2x1mpl2....w4w!!!'

 

 msg.partition('is')   输出 ('my name ', 'is', ' {name}, and age is {age}')

 

 >>> "Kkk li, chinese name is lijie".replace("li","LI",1)

     'Kkk LI, chinese name is lijie'

 

 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() #检测一段字符串可否被当作标志符,即是否符合变量命名规则

True

 

最全示意:

name = "My \tname is {name} and iam {years} old."
print(name.capitalize()) #首字母大写
print(name.count('x')) #统计
print(name.center(50,"-")) #一共输出50个字符,name居中,剩下的用-填充完毕,
print(name.encode()) #编码
print(name.endswith('ing')) #判断是否以ing结尾,常用作邮箱判定是否以.com结尾
print(name.expandtabs(tabsize=30))
print(name.index('a')) #匹配第一个a
print(name[name.find("name"):9]) #切片
print(name.format(name='kkk',years=13))
print(name.format_map({'name':'kkk','years':13})) #字典的格式
print(name.isalnum()) #是否阿拉伯数字,只包含abc...xyz0123456789
print('abc123'.isalnum())
print(name.isalpha()) #是否为纯英文字符(大小写都可以)
print('0x1'.isdecimal()) #判断是否为一个十进制数
print('1a'.isdigit()) #判断是否为一个整数
print('_1a'.isidentifier()) #判断是否为一个合法的标识符(变量名)
print('a 1A'.islower()) #是否为小写
print('111.22'.isnumeric()) #是否为纯数字 等同于isdigit()
print(' '.isspace()) #是不是个空格
print('My Name Is '.istitle()) #是不是每个词首字母大写
print('sdf'.isprintable()) #是否能被打印,若是类似tty文件或drive 文件 不能被打印
name2=['kkk','ysuking',19]
name3=['i','donnot','know']
print(' '.join(name3)) #前面是间隔符,拼接
print('+'.join(str(i) for i in name2)) #如果非str需要转换成str在执行
print(name.ljust(50,'*')) #一共输出50个字符,name居左left,剩下的用*填充完毕,
print(name.rjust(50,'*')) #一共输出50个字符,name居右right,剩下的用*填充完毕,
print('KKK'.lower()) #把大写变成小写
print('kkk'.upper()) #把小写变成大写
print('\nkkk'.lstrip()) #把左边的空格或回车去掉
print('kkk\n'.rstrip()) #把右边的空格或回车去掉
print(' \n kkk \n'.strip()) #把所有的空格和回车都去掉
print('-----')
p = str.maketrans("kbcdef","123456") #建立对应关系
print('ysuking kkk'.translate(p)) #把前面的str按照p的对应关系进行替换

p = str.maketrans("abcdefg","!@#$%^&") #建立对应关系
print('I have A appletree '.translate(p)) #把前面的str按照p的对应关系进行替换
print('ysuking kkk '.replace('k','K',2)) #把什么替换成什么,换几个
print('ysuking kkk '.rfind('k')) #找左右边的'k'
print('ysuking kkk '.split()) #把字符串按照(默认)空格分成列表
print('ysuking kkk '.split('k')) #把字符串按照'k'分成列表
print('1+2\n+3+44'.splitlines()) #把字符串按照换行符分成列表
print('1+2\n+3+44'.startswith("1")) #是否是以1开头的

print('Ysu King'.swapcase()) #大小写互换
print('ysu king'.title()) #按照首字母大写处理各词
print('ysu king'.zfill(50)) #把不够的位数自动用0 填充

 

3. 字典操作

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

语法:

info = {

    'stu1101': "TengLan Wu",

    'stu1102': "LongZe Luola",

    'stu1103': "XiaoZe Maliya",

}

字典的特性:

  • dict无序的
  • key必须是唯一的,so 天生去重

 

增加

>>> info["stu1104"] = "苍井空"

>>> info

{'stu1102': 'LongZe Luola', 'stu1104': '苍井空', 'stu1103': 'XiaoZe Maliya', 'stu1101': 'TengLan Wu'}

 

修改

>>> info['stu1101'] = "武藤兰"

>>> info

{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤兰'}

 

删除

>>> info

{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤兰'}

>>> info.pop("stu1101") #标准删除姿势

'武藤兰'

>>> info

{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}

>>> del info['stu1103'] #换个姿势删除

>>> info

{'stu1102': 'LongZe Luola'}

>>>

>>>

>>>

>>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}

>>> info

{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} #删除最靠后的那个

>>> info.popitem()

{'stu1103': 'XiaoZe Maliya'}

>>> info

('stu1102', 'LongZe Luola')

 

查找

>>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}

>>>

>>> "stu1102" in info #标准用法

True

>>> info.get("stu1102")  #获取

'LongZe Luola'

>>> info["stu1102"] #同上,但是看下面

'LongZe Luola'

>>> info["stu1105"]  #如果一个key不存在,就报错,get不会,不存在只返回None

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: 'stu1105'

 

多级字典嵌套及操作

 

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() #显示所有的value

dict_values(['LongZe Luola', 'XiaoZe Maliya'])

 

#keys

>>> info.keys() #显示所有的key

dict_keys(['stu1102', 'stu1103'])

 

 

#setdefault

>>> info.setdefault("stu1106","Kkk") #去info中取key为“stu1106”,如果有这个key,返回对应的value;如果没有这个key,创建这个key,value就是‘Kkk’

'Kkk'

>>> info

{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Kkk'}

>>> info.setdefault("stu1102","龙泽萝拉")

'LongZe Luola'

>>> info

{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Kkk'}

#update

>>> info

{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Kkk'}

>>> b = {1:2,3:4, "stu1102":"龙泽萝拉"}

>>> info.update(b)

>>> info

{'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Kkk'}

 

#items #把一个字典变成一个列表

info.items()

dict_items([('stu1102', '龙泽萝拉'), (1, 2), (3, 4), ('stu1103', 'XiaoZe Maliya'), ('stu1106', 'Kkk')])

 

 

#通过一个列表生成默认dict,有个没办法解释的坑,少用吧这个

>>> dict.fromkeys([1,2,3],'testd')

{1: 'testd', 2: 'testd', 3: 'testd'}

当遇到多层value时,所有的values共用同一片内存区域

 

循环dict 

 

#方法1

for key in info:  #打印key和value 更加高效,推荐使用

    print(key,info[key])

 

#方法2

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

    print(k,v)

程序练习

程序: 三级菜单

要求: 

  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]

 

 

 pass 占位符/什么都不操作

 

 

posted on 2018-01-11 16:51  小笨1987  阅读(517)  评论(0)    收藏  举报