Python3:列表、元组、字典和集合


概述

内容概述:本章节主要是完成列表、元组、字典和集合的基本操作、并在各个章节穿插了部分的小练习,希望对大家有帮助。


提示:以下是本篇文章正文内容,下面案例仅供参考,欢迎指正

一、列表

1.定义

# 列表定义
"""
 空列表 []
 有内容列表 ['A' ,'B', 'C'],[1,2,3,4,5,6],[[],[],[]]
数据类型:
    int 1 2 3 4 5 6
    float 1.9 2.8 ...
    str: ''
    bool: True False
    list
"""
lst = ['牛奶', '面包', '火腿肠', '臭豆腐']
print(lst[1])  # 索引或者下标获取
print(lst[2])
# 切片 [start:end:step]
print(lst[:2])
print(lst[2:4])
print(lst[::-3])  # ['臭豆腐', '牛奶'] 步长-3

2.函数:排序反转

# 排序和反转
import random

"""
sort:排序
    默认升序
    sort(reverse=True) : 降序
reverse:单纯反转,没有排序
    
"""
# 生成1-20 8个随机正数保存到列表
lst = []
for i in range(8):
    lst.append(random.randint(1, 20))
print(lst)
lst.sort()  # 默认升序
print(lst)
lst.sort(reverse=True)  # 降序升序
print(lst)
lst.reverse()
print(lst)

print('测试:生成数字倒叙排列'.center(50, '-'))
'''
生成8 个1-100 之间的随机正数,保存到列表中
键盘输入一个1-100之间的正数,将正数插入到排序后的列表中,升序或者降序都行
'''

# 生成1-100 8个随机正数保存到列表
lst = []
for i in range(8):
    lst.append(random.randint(1, 100))

num = int(input("键盘输入一个1-100之间的正数:"))
lst.sort(reverse=True)
print(lst)
lst.append(num)
lst.sort(reverse=True)
print(lst)

print('测试:交换两个变量的值'.center(50, '-'))

a = 3
b = 5
print(a, b)
contain = a
a = b
b = contain
print(a, b)

# python 写法
a, b = b, a

print(a, b)
a, b, c = b, a, b  # 交叉赋值
print(a, b, c)


3.基本操作:增、删、改、查

# list 的基本增删改查
import random

"""
增:
    + 、append 、extend
删:
    remove:
        # 报错:x not in list
        # 结合   if 'x' in shelves:  # 判断是否存在 
        元素  in  列表: 表示元素在列表中? 返回值 bool
        如果列表中存在多个同名的元素,只删除遇到的第一个元素
    pop:
        pop(index):根据下标删除表中元素,下表在写的时候注意不要超出范围:index out of range
        pop():从后向前依次删除
    clear :lst.clear(),清空后还可以添加元素
    del : del lst() 删除整个列表,删除后添加元素报错:’lst‘ is  not defined  内存被释放了
    
改:
    insert(index,value):index 位置  value  元素;插队其他元素后移
    lst[1]=2 直接定位赋值
    lst.index(元素):定位元素位置
查:
    1. 元素 in 列表  返回值bool类型
    2. 元素 not in 列表  返回值bool类型  
    3. 列表.index(元素) 返回元素的下标位置,如果没有此元素则报错
    4. 列表.count(元素) 存在返回个数,不存在范围0
"""

print('添加操作'.center(30, '-'))
lst1 = []
lst2 = ['面包']
lst1.append('面条')
lst1.append('火腿')
lst1.append('方便面')
print(lst1)
lst2.append('薯条')
print(lst2)
'''
数字:n = 1+3
字符串:s = 'aa' + 'bb' --->aabb
列表:
    list = [1,2,3,4] + [a,d,f] --->[1,2,3,4,a,d,f]
list合并:
    +  和 extend
'''
lst1 += lst2
print(lst1)

lst1.extend(lst2)
print(lst1)

'''
买多件商品:
    商品名称、价格、数量
    计算商品总数和总价格
'''
shelves = ['面条', '火腿', '方便面', '辣条', '鸡腿', '火腿长']  # 货架
cart = []  # 购物车
sm_price = 0.0  # 商品总价
sm = 0  # 商品总数量
while True:
    product = []
    name = shelves[random.randint(0, 5)]
    price = round(random.random() * 100, 2)
    count = random.randint(1, 10)  # 限制最多10件
    product.append(name)
    product.append(price)
    product.append(count)
    cart.append(product)
    sm_price += price * count
    sm += count
    flag = input('是否退出?(按q/Q退出)')
    if flag.lower() == 'q':
        break
print("购物车:", cart)
print("商品总数", sm)
print("总价格", sm_price)

# 遍历购物清单
print('名称\t\t价格\t\t数量')
for product in cart:
    print(product[0], product[1], product[2], sep="\t\t")

print('删除操作'.center(30, '-'))
print(shelves)
# shelves.pop(9)  # 添加下标,pop index out of range
shelves.pop()  # 根据下标从左道右删除
print(shelves)
# shelves.remove('x')  # 报错:x not in list
# 判断是否存在元素
if 'x' in shelves:  # 判断是否存在
    shelves.remove('x')
shelves.remove('方便面')
print(shelves)  # 根据元素名称删除

print('删除多个元素'.center(30, '-'))
# 删除多个相同元素

goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']

# 会造成漏删:因为下标错乱导致
for good in goods:
    if good == '面条':
        goods.remove(good)
print(goods)

# 解决漏删问题:方案一
while goods.__contains__('面条'):
    for good in goods:
        if good == '面条':
            goods.remove(good)
print(goods)
goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']
# 解决漏删问题:方案二:(拷贝了一份数据)和正反无关
for good in goods[::-1]:
    if good == '面条':
        goods.remove(good)
print(goods)

new_goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']
# 解决漏删问题:方案二 (拷贝了一份数据)
for good in new_goods[::]:
    if good == '面条':
        new_goods.remove(good)
print(new_goods)

del new_goods[3]  # 删除元素  和 new_goods.pop(3) 类似
print(new_goods)

print('修改元素'.center(50, '-'))
lst = [1, 2, 4, 5, 6, 8]
lst.insert(2, 3)
print(lst)

lst[0] = 0
print(lst)

lst[lst.index(8)] = 9  # index(元素) 获取元素位置,定位
print(lst)
print(lst.clear())

print('查找元素'.center(50, '-'))

lst = [1, 2, 4, 5, 6, 8, 8, 8, 8]
print(lst.count(8))
print(lst.count(9))

print('内存地址诠释'.center(50, '-'))

lst = [1, 2, 4, 5, 6, 8, 8, 8, 8]
lst2 = lst
# lst.clear()
del lst2  # 删除指针指向
print(lst)
# print(lst2)
print(id(lst))
# print(id(lst2))

4.列表推导式

# 列表推导式

"""
列表推导式:最终得到的是一个列表:
格式:
    lst = [i for i in range(100)]
    lst = [i for i in range(100) if 条件]
    lst = [i if 条件1 else 条件2 for i in range(100) ]

"""

# 传统
lst = []
for i in range(20):
    lst.append(i)
print(lst)

# 列表推导式
lst = [i for i in range(20)]
print(lst)

lst = [i + 2 for i in range(20)]  # 格式一
print(lst)

lst = [i for i in range(0, 101, 2)]  # 格式一
print(lst)

lst = [i for i in range(101) if i % 2 == 0]  # 格式二:带判断条件
print(lst)

lst2 = ['62', 'hello', '100', 'world', 'luck', '88']
lst = [word for word in lst2 if word.isalpha()]  # 全部是字母组成的新单词
print(lst)

# 如果是h开头的首字母大写,如果不是h开头的则全部转成大写  if else

lst = [word.title() if (word.isalpha() and word.startswith('h'))
       else word.upper()
       for word in lst2]
print(lst)

# 2层for 循环

lst3 = [(i, j) for i in range(5) for j in range(5)]  # 2层for循环
print(lst3)

# 实现将1-100 中的数字3个一组如[[1,2,3],[4,5,6]...]
lst = [[i, i + 1, i + 2] if i < 100 else [i] for i in range(1, 101, 3)]
print(lst)

nei_lst = [i for i in range(1, 101)]
lst = [nei_lst[i:i + 3] for i in range(0, len(nei_lst), 3)]
print(lst)

5. 练习

# 练习
import random
import time

print(round(random.random() * 100, 2))  # 保留两位小数

print('练习:冒泡排序'.center(50, '-'))

# 生成1-100 8个随机正数保存到列表
lst = []
for i in range(8):
    lst.append(random.randint(1, 100))

for j in range(len(lst) - 1):  # 轮数
    for i in range(len(lst) - 1 - j):  # 两两比较
        if lst[i] > lst[i + 1]:
            lst[i], lst[i + 1] = lst[i + 1], lst[i]  # 交换变量 升序

print(lst)

print('练习:王者荣耀'.center(50, '-'))

'''
王者荣耀角色管理:
    角色:姓名 性别 职业
    
    添加角色
    删除角色
    修改角色
    查询角色
    查询所有角色
    退出系统
'''

print('欢迎进入王者荣耀角色管理'.center(30, '~'))

roles = []
flg = True
while flg:
    print('''
        当前系统有如下功能
            1. 添加角色
            2. 删除角色
            3. 修改角色
            4. 查询角色
            5. 查询所有角色
            6. 退出系统
        ''')
    choose = input("请选择:")

    if choose == '1':
        while True:
            name = input("输入角色名称:")
            key = input("输入角色key:")
            for role in roles:  # 判断角色是否存在
                if role.__contains__(key):
                    print("请重新输入:该角色key存在")
                    continue
            role = [name, key]
            roles.append(role)
            flag = input("是否退出(q/Q):")
            if flag.lower() == 'q':
                break
        # 查询
        print("查询角色:", roles)
    elif choose == '2':
        key = input("输入需要删除的角色key:")
        for role in roles:
            if role.__contains__(key):
                roles.remove(role)
    elif choose == '3':
        key = input("输入需要修改的角色key:")
        new_name = input("输入新的角色名称:")
        new_key = input("输入新的角色key:")
        for role in roles:
            if role.__contains__(key):
                role.clear()
                role.append(new_name)
                role.append(new_key)
        print("修改后的角色列表:", roles)
    elif choose == '4':
        key = input("输入需要查询的角色key:")
        for role in roles:
            if role.__contains__(key):  # 或者:key  in  role
                print("角色key对应的角色信息:", role)
    elif choose == '5':
        print("所有角色:", roles)
    elif choose == '6':
        print("正在退出系统...")
        time.sleep(3)  # 休眠三秒
        print("退出系统成功,欢迎下次再来!")
        flg = False
    else:
        print("输入有误请重新输入!")


二、元组

1.基本操作

代码如下(示例):

# 元组操作

"""
python 中元组只能存,不能修改(修改、删除、增)
元组 小括号(),列表:方括号[];
tuple:元组
    当一个元素的时候,必须加一个, 如 ('123',)
    注意:没有逗号,就不是元组

    count() 计数
list:列表

list 和tuple互转:
    list(tup): 元组转列表
    tuple(lst):列表转元组

"""

tup = ("123", 123, 'aaa', 'bbb')

print(tup)
print(type(tup))  # <class 'tuple'>
tup = ("123")  # <class 'str'>
print(type(tup))
tup = ("123",)  # <class 'tuple'>
print(type(tup))

# 下标和切片同样适用---->字符串、列表、元组注意下标越界
tup = ("123", 123, 'aaa', 'bbb', 123)
print(tup[1])

print(tup[:2])
print(tup[::2])

# 添加元素 count() 计数
print(tup.count(123))

print(tup.index('123'))
print(tup.index('bbb', 1))  # 开始、结束位置

print(len(tup))

for i in tup:
    print(i)

# 元组转列表

lst = list(tup)  # 元组转列表
print(lst)
lst.append('guess')
tup = tuple(lst)  # 元组转列表
print(tup)


三、字典

1. 增删改查基本操作

# 字典操作
"""
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下所示:

修改:
    存在key  修改
添加:
    不存在key  添加
删除:
    pop:根据key删除
    popitem() :默认是从后往前删除,返回元组(key,value);没有元素会抛出异常
    del book[key]
查询:
    列表:list.index list.count in
    book.get(key) 、get(key,'默认值'):根据key获取value值,没有返回None或者默认值
    dict[key] 根据key获取value值: 没有返回key 报error错误
    keys():获取key
        for  k  in book.keys():
            print(k)
    values():获取值
        for  v  in book.values():
            print(v)
    items() :获取键值对
        for  k,v  in book.items():
            print(k,v)
"""
dict1 = {'name': '李四', 'age': 18, 'sex': '男'}
print(type(dict1))
print(dict1)
# 如果存在key则修改
dict1['name'] = '张三'
dict1['age'] = 20
dict1['sex'] = '男'
print(dict1)
# 如果不存在key则添加
dict1['score'] = 90
print(dict1)

'''
书库:
    book = {}
    书名、价格、作者、出版社
    促销:价格折扣:8折
    打印最终字典中的值
'''
library = []  # 图书馆
book = {}
while True:
    print("添加书本:")
    name = input("书名:")
    price = float(input("价格:"))
    author = input("作者:")
    publishing_house = input("出版社:")
    book = {"书名": name, "价格": price, "作者": author, "出版社": publishing_house}
    library.append(book)
    flag = input("是否退出(q/Q):")
    if flag.lower() == 'q':
        break
print("促销打折".center(30, '*'))

# 修改
for book in library:
    if book.get('书名') == '西游记':
        book['价格'] *= 0.8  # 如果是西游记打8折出售

print(library)

# 遍历和查询
print("遍历和查询".center(30, '*'))
for book in library:
    if book.get('书名') == '西游记':  # 获取
        print(book)
    for k, v in book.items():
        print([k, v])
print(len(book))
print(book.items())  # 获取字典中所有的键值对
print(book.keys())  # 获取字典中所有的key
print(book.values())  # 获取字典中所有的值
print(list(book.values()))  # 获取字典中所有的值

# 删除字段
print("删除字段".center(30, '*'))
for book in library:
    if book.get('书名') == '红楼梦':
        book.pop("书名")
print(library)

print("函数补充".center(30, '*'))

# 增加
book.setdefault('discount', 0.8)  # 只能做添加k-v使用
print(book)
dict1 = {'test': '测试'}
book.update(dict1)  # 字典合并,不能使用+号
print(book)

book.fromkeys(book)  # 返回新的字典
book.fromkeys(['a', 'b'])  # 用给的列表,创建返回一个新的字典
print(book.fromkeys(book))

m1, m2 = input("请输入用户名 密码:").split(' ')
print(m1, m2)

# 字典转换其他 :可以转换,只是将字典的键放到列表、元组、集合中
print("字典转换".center(30, '*'))

schools = {"name": "张三", "age": 18}
result = list(schools)
print(result)
result = set(schools)
print(result)
result = tuple(schools)
print(result)
# 其他转换字典

lst = [("name", "张三"), ("age", 18)]  # 只有这种可以转
dic2 = dict(lst)
print(dic2)


四、集合

1. 基本操作

# set 集合
import random

"""
set :
    特点:无序的,所以无下标
    符号:{} {元素、元素、元素}----->集合
        {}  {k:v,kk:v}---------> 字典
    定义空set:
        st = set() # 定义空set
        st = {} # 表示字典
    增加:
        add
        update( x ) :也可以添加元素,且参数可以是列表,元组,字典等。
    删除:
        remove: 有元素删除、如果没有报错:keyError
        discard:有就删除,没有就不删除
        del: 删除集合
        clear:清空集合
    交集、并集、差集:
        difference 或者 -: 差集 
        intersection 或者 &:交集 
        union 或者 |: 并集 
    
"""

st = {'zhangsan'}
print(type(st))

lst = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3]

print(lst)
print(set(lst))  # 去重

st = set()  # 定义空set
print(type(st))

# set 增加
st.add('张三')
st.add('李四')
st.add('王五')
print(st)
st1 = {'赵六'}  # 集合合并
st.update(st1)
print(st)  # 每一次的顺序无需,

# set 删除
st.remove('张三')
print(st)

print('生成字母数字的验证码'.center(40, '#'))
'''
练习:
    产生 5组不允许重复,字母和数字组合4位验证码
    s = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM123456789'
    也可以采用函数:random.choice(s)  或者 random.random(0,len(s)-1)
'''
code_set = set()
while len(code_set) < 5:

    strs = ''
    while len(strs) < 4:
        num = random.randint(0, 127)
        if ord('a') <= num <= ord('z') or ord('A') <= num <=  ord('Z'):
            strs += chr(num)
        elif 0 <= num <= 9:
            strs += str(num)
    code_set.add(strs)

print("5组4位随机验证码:{}".format(code_set))

# 补充删除
# del code_set  # 删除集合
# code_set.clear()  # 清空
code_set.pop()  # 随机删除

# 交集、并集、差集
set1 = {1, 2, 3, 4, 5, 6, 7}
set2 = {6, 7, 8, 9, 0}
print(set1.intersection(set2))  # 交集
print(set1.union(set2))  # 并集
print(set1.difference(set2))  # 差集:有顺序
print(set2.difference(set1))  # 差集

#  | & -

print(set1 & set2)  # 交集
print(set1 | set2)  # 并集
print(set1 - set2)  # 差集

2. ord 和chr

# ord  获取 字母的Unicode值
print(ord('a'))
print(ord('z'))
print(ord('A'))
print(ord('Z'))

print(chr(97))


五、公共方法

1. 元组、列表、字典和集合对比(图书管理系统)

"""
类型
    list: 允许元素重复、有序有下标 []
    tuple: 允许重复,里面的元素不能增加删除修改、只能查看 ()
    dict: 键值对出现,键是唯一的,值允许重复{}
    set: 不允许重复,无序 {}
类型转换:
    tuple ---> list
    list ---> tuple,set(长度可能变化)
    set ---> tuple,list

    dict ---> list、set、tuple 可以转换、但是只是将字典的键放到[],{},()

    list---> dict:
        可以转换,单格式要求必须是:lst = [("name", "张三"), ("age", 18)];lst = [["name", "张三"], ["age", 18]]
"""

'''
练习:
    图书管理系统
    library  :
        字典存取:library = {"书名": name, "价格": price, "作者": author,"库存":in_stock}
    功能:
        1. 借书
        2. 还书
        3. 查询
        4. 查询所有
        5. 退出    
'''
library = [
    {"name": "西游记", "price": 100, "author": '吴承恩', "in_stock": 3},
    {"name": "红楼梦", "price": 300, "author": '曹雪芹', "in_stock": 2},
    {"name": "三国演义", "price": 200, "author": '罗贯中', "in_stock": 2},
    {"name": "水浒传", "price": 80, "author": '施耐庵', "in_stock": 1}
]

while True:
    print('''
        欢迎进入图书管理系统
            1. 借书
            2. 还书
            3. 查询
            4. 查询所有
            5. 退出 
    ''')
    choose = input("请选择进入:")
    if choose == '1':
        while True:
            print("欢迎进入借书管理".center(10, '*'))
            book_name = input("请输入借阅的书籍名称:")
            bk = {}
            for book in library:
                if book.get('name') == book_name:
                    bk = book
                    stock_num = book.get("in_stock")
                    if stock_num > 0:
                        while True:
                            print("书籍详情:", book)
                            is_borrow = input("是否借阅(1:是,2:否):")
                            if is_borrow == '2':
                                print("退出借阅")
                                break
                            elif is_borrow == '1':
                                borrow_num = int(input("请输入借阅数量:"))
                                stock_num = book.get("in_stock")
                                if stock_num >= borrow_num > 0:
                                    book['in_stock'] = stock_num - borrow_num
                                    flg = input("是否退出(Q/q)")
                                    if flg.lower() == 'q':
                                        break
                                elif stock_num < borrow_num:
                                    print("借阅数量超过库存,请重新选择!")
                            else:
                                print("输入有误请检查!")
                    else:
                        print("该藏书已被全部借阅,请重新选择或者改天再来!")
            if len(bk) == 0:
                print("图书馆没有该藏书,请重新输入!")
            flg = input("是否退出借阅(Q/q)")
            if flg.lower() == 'q':
                break
    elif choose == '2':
        while True:
            print("欢迎进入还书管理".center(10, '*'))
            book_name = input("请输入要还的书籍名称:")
            bk = {}
            for book in library:
                if book.get('name') == book_name:
                    bk = book
                    stock_num = book.get("in_stock")
                    print("书籍详情:", book)
                    while True:
                        is_return = input("是否还书(1:是,2:否):")
                        if is_return == '2':
                            print("退出还书")
                            break
                        elif is_return == '1':
                            return_num = int(input("请输入归还数量:"))
                            if return_num > 0:
                                book['in_stock'] = stock_num + return_num
                                print("当前书籍库存情况:", book)
                                flg = input("是否退出(Q/q)")
                                if flg.lower() == 'q':
                                    break
                            else:
                                print("输入有误请检查!")
                        else:
                            print("输入有误请检查!")
            if len(bk) == 0:
                print("图书馆没有该藏书,请检查输入!")
            flg = input("是否退出归还(Q/q)")
            if flg.lower() == 'q':
                break
    elif choose == '3':
        while True:
            print("欢迎进入查询管理".center(10, '*'))
            book_name = input("请输入要查询书籍名称:")
            bk = {}
            for book in library:
                if book.get('name') == book_name:
                    bk = book
                    print("书籍详情:", book)
            if len(bk) == 0:
                print("图书馆没有该藏书,请重新输入!")
            flg = input("是否退出查询(Q/q)")
            if flg.lower() == 'q':
                break
    elif choose == '4':
        while True:
            print("欢迎进入查询所有管理".center(10, '*'))
            print("{}{}{}{}".format("书名".center(10), "价格".center(10), "作者".center(10), "库存".center(10)))
            for book in library:
                print("{}{}{}{}".format(book.get('name').center(10), str(book.get('price')).center(10),
                                        book.get('author').center(10), str(book.get('in_stock')).center(10)))
            flg = input("是否退出查询所有(Q/q)")
            if flg.lower() == 'q':
                break
    elif choose == '5':
        flag = input("是否退出图书管理系统(q/Q):")
        if flag.lower() == 'q':
            break
    else:
        print("输入有误请重新输入!")


2. 公共方法

# 公共方法
"""
print()
id()
input()
type()
id()
len()
oct()
hex()
chr()
ord()
"""

lst = [1, 3, 5, 73, 7, 80, 53, 6, 8, 32, 79, 33]

print(max(lst))  # 最大值
print(min(lst))  # 最小值
print(sum(lst))  # 求和
print(abs(-1))  # 绝对值

tup = (1, 9, 8, 4, 5, 6)

result = sorted(tup, reverse=True)  # 倒叙
print(result)
result = sorted(tup)
print(result)

result = chr(96)  # AscII 码
print(result)
result = chr(65)
print(result)

result = ord('a')  # AscII 码
print(result)
result = ord('z')
print(result)
result = ord('A')
print(result)
result = ord('Z')

print(result)

# 符号 + - * & |

# + (合并): 支持字符串、列表、元组
result = 'hello' + 'world'
print(result)
result = [1, 2, 3, 4] + [5, 6, 7]
print(result)
result = (1, 2, 3, 4) + (1, 2, 3, 4)
print(result)
# * (复制): 支持字符串、列表、元组
result = [1, 2] * 4
print(result)
# - & | 只能交集、并集、差集

# in /not in : 元素是否存在,字符串、列表、元组、字典(判断key是否存在)


总结

文章总结如下:
以上就是本文要讲的内容,本文仅仅简单介绍了集合、元组、列表和字典的基本使用,大家可以酌情参考学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值