Python从基础到精通day5

列表和元组 、 字典 、 集合

列表

  • 属于容器、可变、顺序类型
>>> from random import randint
>>> l1 = [randint(1, 100) for i in range(10)]
>>> l1
[47, 95, 14, 21, 28, 80, 23, 98, 17, 37]
>>> l1[0] = 80
>>> l1[2:4] = [10,50,20,80]
>>> l1
[80, 95, 10, 50, 20, 80, 28, 80, 23, 98, 17, 37]
  • 列表方法
>>> l1.append(80)     # 追加元素
>>> l1.insert(0, 20)  # 在下标为0的位置插入20
>>> l1.extend([10, 20, 30])  # 向列表尾部增加3项
>>> l1.append([10, 20, 30])  # 向列表尾部增加1个列表
>>> l1.pop()          # 默认将列表最后一项弹出
>>> l1.index(98)      # 返回数据项98的下标
>>> l1.pop(10)        # 弹出下标为10的数据项
>>> l1.remove(20)     # 删除数据项20的第一次出现
>>> l1.sort()         # 排序
>>> l1.reverse()      # 翻转
>>> l1.count(80)      # 统计80出现的次数
>>> l2 = l1           # l1和l2指向相同内存空间
>>> l2
[95, 80, 80, 80, 80, 50, 37, 30, 28, 23, 20, 20, 17, 10, 10]
>>> while 80 in l2:   # 删除所有的80
...   l2.remove(80)
>>> l2
[95, 50, 37, 30, 28, 23, 20, 20, 17, 10, 10]
>>> l1                # l1与l2指向相同空间,所以也没有80了
[95, 50, 37, 30, 28, 23, 20, 20, 17, 10, 10]
>>> l3 = l1.copy()    # 将l1的内容赋值给l3
>>> l1.clear()        # 清空列表
>>> l3                # l3并未清空
[95, 50, 37, 30, 28, 23, 20, 20, 17, 10, 10]

元组

  • 属于容器、不可变、顺序类型
  • 元组相当于是不可变的列表
>>> t1 = (10, 20, 30, 20, 100)
>>> t1.count(20)   # 统计20出现的次数
2
>>> t1.index(30)   # 返回30的下标
2
  • 单元素元组必须在最后有一个逗号
>>> t2 = (10)
>>> type(t2)
<class 'int'>
>>> t2
10
>>> t3 = (10,)
>>> type(t3)
<class 'tuple'>
>>> t3
(10,)
>>> len(t3)
1
练习1:列表模拟栈结构
#!/uer/bin/env python3
stack = []  首先定义一个存储数据的列表
def push_it():
    data = input('数据:').strip()  strip去除字符串两端空格
    if not data:
        print('格式错误,请重新尝试')
    stack.append(data)

def pop_it():
    def pop_it():
    if [] == stack:
        print('空')
    else:
		print('从栈中弹出了% s' % stack.pop())

def view_it():
    print(stack)

def menu_it():
    promat = """(0)压栈
(1)出栈
(2)查询
(3)退出
请选择(0/1/2/3)"""
    while 1:
     show_menu():
    "用于在屏幕上打印菜单,根据用户选择调用相关函数"
    # 将函数保存到字典中。注意函数名不要加引号,因为加引号表示字符串,不是函数名
    # 函数名后面不要加()。因为加(),表示函数调用,将函数结果保存到字典

        dic = {'0':push_it,'1':pop_it,'2':view_it} 定义一个字典用来调用函数
        xz = input(promat).strip()
        if xz not in ['0','1','2','3']:
            print('格式错误,请重试')
            return
        if xz == '3':
            print('bye','bye')
            break
        # elif xz == '2':
        #     view_it()
        # elif xz == '3':
        #     print('%s %s' %('bye','bye'))
        #     break
        dic[xz]()  通过字典的key来获取value。



if __name__ == '__main__':
    menu_it()

字典

  • 属于容器、可变、映射类型
  • 字典的key不能重复
  • 通过key进行赋值时,如果key已在字典中则修改值;如果key不在字典中,则新增值
  • 字典的key,必须是不可变类型
>>> d1 = {'name': 'tom', 'name': 'bob'}
>>> d1
{'name': 'bob'}
>>> d1['name'] = 'jerry'
>>> d1
{'name': 'jerry'}
>>> d1['age'] = 20
>>> d1
{'name': 'jerry', 'age': 20}
>>> d1[(100, 200)] = 'home'
>>> d1
{'name': 'jerry', 'age': 20, (100, 200): 'home'}
>>> d1[[100, 200]] = 'home'  # 报错,key不能是可变对象
>>> len(d1)
3
>>> 20 in d1    # 20是字典的key吗?
False
>>> 'age' in d1
True
>>> d1[0]       # 字典没有顺序,如果没有名为0的key则报错

# 通过dict函数创建字典
>>> d2 = dict([('name', 'tom'), ('qq', '12345243'), ('email', 'tom@tedu.cn')])
>>> d2
{'name': 'tom', 'qq': '12345243', 'email': 'tom@tedu.cn'}
>>> d3 = {}.fromkeys(['tom', 'jerry', 'bob', 'alice'], 20)
>>> d3
{'tom': 20, 'jerry': 20, 'bob': 20, 'alice': 20}

# 遍历字典
>>> for k in d2:
...   print(k, d2[k])

# 字典的clear和copy方法与列表完全一样
# 字典的get方法是最常用的方法 
>>> d2.get('name')   # 取出key为name的值
'tom'
# 如果key不存在,默认返回None
>>> print(d2.get('phone'))
None
# 如果key不存在,也可以返回指定的值
>>> print(d2.get('phone', 'not found'))
not found
>>> print(d2.get('email', 'not found'))
tom@tedu.cn

>>> d2.keys()    # 取出所有的key
dict_keys(['name', 'qq', 'email'])
>>> list(d2.keys())
['name', 'qq', 'email']
>>> d2.values()  # 取出所有的values
dict_values(['tom', '12345243', 'tom@tedu.cn'])
>>> list(d2.items())  # 取出所有的(key, val)
[('name', 'tom'), ('qq', '12345243'), ('email', 'tom@tedu.cn')]
>>> d2.pop('qq')  # 弹出key为qq的项目
'12345243'
>>> d2.update({'city': 'shenzhen', 'age': 20})
>>> d2
{'name': 'tom', 'email': 'tom@tedu.cn', 'city': 'shenzhen', 'age': 20}
练习2:字典使用的练习
import getpass
users = {} #定义一个字典用来存储
def register():
    user = input('请输入用户名:').strip()
    if user in users:
        print('\033[32m;1m用户以存在\033[0m')
    elif not user:
        print('\033[32;1m用户名不能为空\033[0m')
    else:
        password = getpass.getpass('密码:')
        users[user]=password   #字典里没有这个key则创建key和value
        print('\033[32;1m注册成功\033[0m')

def login():
    username  = input('用户名:')
    password = getpass.getpass('密码:')
    # if username in users and users[username] == password:
    if users.get(username) == password:     #判断字典里是否有输入的用户名。
        print('\033[32;1mLogin sussfull\033[0m')
        break
    else:
        print('\033[31;1mLogin error\033[0m')


def show_menu():
    promat = """(1)注册:
(2)登陆:
(3)退出
请选择(0/1/2):"""
    funs = {'1':register,'2':login}
    while 1:
        xz = input(promat).strip()
        if xz  not in {'1','2','3'}:
            print('格式错误')
            continue

        if xz == '3':
            print('Bye...')
            break

        funs[xz]()

if __name__ == '__main__':
    show_menu()

测试运行

[root@python day5]# python3 lianxi.py 
(1)注册:
(2)登陆:
(3)退出
请选择(0/1/2):1
请输入用户名:wenhao
密码: 此处不显示密码是因为调用了getpass.getpass
注册成功
(1)注册:
(2)登陆:
(3)退出
请选择(0/1/2):2
用户名:bob
密码: 
Login error
(1)注册:
(2)登陆:
(3)退出
请选择(0/1/2):2
用户名:wenhao
密码:
Login sussfull
(1)注册:
(2)登陆:
(3)退出
请选择(0/1/2):3
Bye...

集合

  • 数学上,集合set是由不同元素构成的
  • 集合中数据,被称作集合元素。集合元素都是不可变对象。
  • 集合没有顺序
  • 集合就像是一个无值的字典
  • 集合分成可变集合set,和不可变集合frozenset
>>> s1 = {10, 20, 30, 'abc', 'tom', 'jerry'}
>>> type(s1)
<class 'set'>
>>> s1
{10, 'jerry', 'abc', 20, 'tom', 30}
>>> s2 = set([10, 20, 30, 40, 50])
>>> s2
{40, 10, 50, 20, 30}
>>> s3 = set('abc')
>>> s4 = set('bcd')
>>> s3
{'c', 'b', 'a'}
>>> s4
{'d', 'c', 'b'}

>>> len(s2)
5
>>> for i in s2:
...   print(i)
>>> 20 in s2
True
>>> 100 not in s2
True


>>> s3 & s4   # 交集
{'c', 'b'}
>>> s3 | s4   # 并集
{'d', 'c', 'b', 'a'}
>>> s3 - s4   # 差补,s3中有,s4中没有的是哪些
{'a'}
>>> s4 - s3
{'d'}
  • 集合方法
>>> s2.add(100)   # 添加元素
>>> s2.pop()      # 弹出一个元素
100
>>> s2.remove(50) # 移除50
>>> s3.union(s4)  # s3 | s4 s3和s4所有的都列出来
{'d', 'c', 'b', 'a'}
>>> s3.intersection(s4)  # s3 & s4;s3和s4都有的是哪些
{'c', 'b'}
>>> s3.difference(s4)    # s3 - s4  s3中有s4中没有的
{'a'}
>>> s5 = s3.union(s4)
>>> s3.issubset(s5)      # s3是s5的子集吗?
True
>>> s5.issuperset(s3)    # s5是s3的超集吗?
True
  • 集合天然可以去重复
>>> from random import randint
>>> nums = [randint(1, 50) for i in range(20)]
>>> nums
[36, 41, 6, 44, 45, 30, 48, 20, 45, 50, 25, 28, 39, 20, 14, 22, 24, 4, 18, 44]
>>> set(nums)
{36, 4, 6, 39, 41, 44, 45, 14, 48, 50, 18, 20, 22, 24, 25, 28, 30}
>>> list(set(nums))
[36, 4, 6, 39, 41, 44, 45, 14, 48, 50, 18, 20, 22, 24, 25, 28, 30]

# 没有集合的情况下,手工去重
>>> result = []
>>> for i in nums:
...   if i not in result:
...     result.append(i)
练习3:找到mima中有passwd中没有的行
[root@localhost day05]# cp /etc/passwd /tmp/
[root@localhost day05]# cp /etc/passwd /tmp/mima
# 修改mima,使之与passwd不一样
[root@localhost day05]# vim /tmp/mima
>>> with open('/tmp/mima') as f1:
...   s1 = set(f1)
>>> with open('/tmp/passwd') as f2:
...   s2 = set(f2)
>>> s3 = s1 - s2
>>> s3
{'how are you?\n', 'hello world!\n'}
>>> with open('/tmp/result.txt', 'w') as f3:
...   f3.writelines(s3)
[root@localhost day05]# cat /tmp/result.txt 
how are you?
hello world!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值