linux系统python中的列表 || python中的集合

一.列表

1. 列表的创建:

数组: 存储同一数据类型的组合;
列表:可以存储不通类型的数据。
• 定义一个空列表
list = []
• 定义一个包含元素的列表,元素可以是任意类型,包括数值类型,
列表,字符串等均可。
# 定义一个包含元素的列表
l = [1, 2e+8, 2j+9, True, "hello"]
print(l2, type(l2))

这里写图片描述

2. # 列表里面存储列表

列表里面存储列表:
l2 = [[2,34,2],'hello',2,'linux',32]
print(l2,type(l2))

这里写图片描述

3. 列表的特性:

列表的特性:
索引, 切片, 重复, 连接, 成员操作符

索引:

l = [1, 2e+8, 2j+9,[1,3,2],True, "hello"]
print(l[0])       #打印第一个元素
print(l[-1])      #打印最后一个元素
print(l[3])       #打印第四个元素
嵌套列表的索引:
l3 = [[1,2,3,4], [5,6,7,8],1, 2e+8, 2j+9, True, "hello"]
print(l3[0][-1])
print(l3[-1][2])   # l3[-1] = "hello"    "hello"[2]

这里写图片描述

强制转换range(5)的返回值为列表 :

强制转换range(5)的返回值为列表 :
l4 = list(range(5))

print(l4[:-1])
print(l4[1:])
print(l4[::-1])

这里写图片描述

重复:

重复:
l4 = list(range(5))
print(l4*4)

这里写图片描述

连接:

连接:
l3 = [[1,2,3,4], [5,6,7,8],1, 2e+8, 2j+9, True, "hello"]
l4 = list(range(5))
print(l3+l4)

这里写图片描述

成员操作符:

成员操作符:
l3 = [[1,2,3,4], [5,6,7,8],1, 2e+8, 2j+9, True, "hello"]
l4 = list(range(5))
print(1 in l4)
print(1 not in l4)

这里写图片描述

示例:

判断一个单词是否喜欢:
当单词都是大写并且没有两个连续相同的字母是输出喜欢,
否则输出不喜欢。
s = input("string:")
# 1. 单词每个字母都是大写字母
if s.isupper() and isinstance(s,str) and len(s)<100:
    # 单词没有连续相等的字母
    s_len = len(s)
    for index in range(s_len-1):
        if s[index] == s[index+1]:
            print('Dislikes')
            break
    else:
        print('Likes')
else:
    print('Dislikes')

这里写图片描述

示例:列表练习

假定有下面这样的列表:
    names = ['fentiao', 'fendai', 'fensi', 'apple']

    输出结果为:'I have fentiao, fendai, fensi and apple.'

考察点:
    切片:
    字符串的join方法:
names = ['fentiao', 'fendai', 'fensi', 'apple']
print("I have " + ",".join(names[:-1]) + " and " + names[-1])

这里写图片描述

4. 列表的增加

languages = ['shell', 'c', 'python']

# # append: 追加, 追加元素到列表的最后;
languages.append('java')
print(languages)

# extend: 追加多个元素到列表中;
other = ['Go', 'perl', 'php']
languages.extend(other)
print(languages)

# # # insert: 添加元素到指定索引的前面;
languages.insert(0, 'C++')
print(languages)

这里写图片描述

5. 列表的删除

names = ['fentiao','fendai','fensi','apple']
names.remove('fensi')                 #删除fensi元素
print(names)
names.pop(-1)                         #弹出最后一个元素
print(names)
查看删除的元素:
reversed_two_intem = names.pop(-2)    #将删除的元素赋给变量
print(reversed_two_intem)
del names                             #删除列表
print(names)                          #打印会报错
del names[0]                          #删除列表的第一个元素
print(names)

这里写图片描述

clear: 清空列表
l = ['shell','c','python','shell','c','c#']
l.clear()
print(l)          #打印出是一个空列表

这里写图片描述

示例:

# 1.删除列表中重复的所有元素
l = ['shell','c','python','shell','c','c#']
new_l = []
# 去掉重复的元素
for i in l:
    if i not in new_l and l.count(i) == 1:
        new_l.append(i)
print(new_l)

# 2.删除重复的元素:仅删除重复的元素
for i in l:
    if i not in new_l:
        new_l.append(i)
print(new_l)

执行结果:

这里写图片描述

示例:

用户登陆系统:
1).已知多个用户名和密码分别保存在列表中;
2).判断用户名是否存在,
    如果登陆的用户名不存在,则报错;
    如果用户存在,则判断密码是否正确;
        如果正确,输出登陆成功;
        如果不正确,输出登陆失败;
3).为防止黑客暴力破解密码,登陆最多3次机会;
names = ['root','student']        #用户列表
passwds = ['redhat','student']     #密码列表
for trycount in range(3):
    name = input("username:")     #用户输入
    passwd = input("password:")
    #判断用户是否存在?
    if name in names:
        #判断该用户的密码是否正确:
        #1).先找出该用户在列表中的索引
        #2).拿出该用户对应的密码
        index = names.index(name)    
        db_pass = passwds[index]
        if db_pass == passwd:
            print("登陆成功!")
            break
        else:
            print("用户密码错误!")
    else:
        print("%s用户不存在" %(name))
else:
    print("登陆超过三次机会!")

执行结果:

这里写图片描述

6. 修改列表元素

languages = ['shell', 'c', 'python', 'shell2']

1.通过索引修改列表元素;
languages[0] = 'java'
print(languages)

2.通过切片修改列表元素;
languages[:2] = ['perl', 'matlab']
print(languages)

这里写图片描述

7.查看

languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c']
languages.count('shell')
print(languages.index('shell',1,4))

8.复制

# 该方式不能实现复制, 因为两个变量指向同一块内存空间;
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c']
languages1 = languages
languages.append('PHP')
print(id(languages), id(languages1))
print(languages)
print(languages1)

这里写图片描述

第一种实现列表的复制;
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c','e']
languages1 = languages.copy()
print(id(languages), id(languages1))  #指向不同的空间
languages.append('Go')     #langusges更改langusges1不会更改
print(languages1)

这里写图片描述

第2种实现列表的复制;
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c','e']
languages1 = languages[:]
print(id(languages), id(languages1))
languages.append('Go')
print(languages1)

这里写图片描述

9.排序与反转

对于字母的排序:
1.字母按照ASCII码从小到大排序;
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c','e']
languages.sort()
print(languages)

2.字母按照ASCII码从大到小排序;
languages.sort(reverse=True)
print(languages)

这里写图片描述

反转:
# 直接反转, 类似l[::-1]
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c','e']
languages.reverse()
print(languages)

这里写图片描述

10.通过列表构建queue队列:先进先出

queue队列工作原理:先进先出

queue队列练习:先进先出
queue = []
max_count = 10
menu = """
           队列元素
           1).入队
           2).出队
           3).队头
           4).队尾
           5).队列长度
           6).队列元素
           7).队列是否为空
           8).队列是否已满:full
请输入你的选择:"""
choice = input(menu)
if choice == '1':
    print("入队操作".center(30,'*'))
    if len(queue) < 10:
        item = input("入队元素:")
        queue.append(item)
        print("%s入队成功!" %(item))
    else:
        print("队列已满!")
elif choice == '2':
    if not queue:
        print("队列为空")
    else:
        item = queue.pop(0)
        print("%s出对成功,队列为:%s" %(item,queue))
elif choice == '3':
    if len(queue) == 0:
        print("队列为空!")
    else:
        print("队头为:%s" %(queue[0]))
elif choice == '4':
    if len(queue) == 0:
        print("队列为空!")
    else:
        print("队尾为:%s" %(queue[:-1]))
elif choice == '5':
    print("队列长度为:%s" %(len(queue)))
elif choice == '6':
    for i in queue:
        print(i,end=',')
else:
    print("错误的选择:%s" %(choice))

这里写图片描述

11. 通过列表构建栈的数据结构:

栈的工作原理: 先进后出

stack = [1,3,4,]
max_count = 10
menu = """
         栈元素
         1).入栈
         2).出栈
         3).栈元素
         4).栈顶元素
         5).栈长度
         6).栈是否为空
请输入你的选择:"""
choice = input(menu)
if choice == '1':
    print("入栈操作".center(30,'*'))
    if len(stack) < 10:
        item = input("入栈元素:")
        stack.append(item)
        print("%s入栈成功!" %(item))
    else:
        print("栈已满!")
if choice == '2':
    if not stack:
        print("栈为空!")
    else:
        item = stack.pop(0)
        print("%s出栈成功,栈为:%s" %(item,stack))
if choice == '3':
    if len(stack) == 0:
        print("栈为空!")
    else:
        for i in stack:
            print(i,end=',')
if choice == '4':
    if len(stack) == 0:
        print("栈为空!")
    else:
        print("栈顶元素为:%s" %(stack[0]))
if choice == '5':
    print("栈长度为:%s" %(len(stack)))
if choice == '6':
    if len(stack) == 0:
        print("栈为空!")
    else:
        print("栈不为空!")
 执行结果:

这里写图片描述

12. is和==的区别

id: 在内存中存储的位置
type: 变量的;类型
value: 值是否相等;
== 判断: type, value
is: type, value, id
结论:
  is表示的是对象标识符;表示两个变量的值是否在同一块内存空间;
  ==表示的是值是否相等;

总结: is返回值为True, ==返回一定是True;

13. 深拷贝与浅拷贝

>>> import copy      #导入模块
深拷贝:
>>> l = [[[2,35,],3,4],3,65,1]
>>> la = copy.deepcopy(l)
>>> id(l[0][0]),id(la[0][0])     #指向不同的内存空间
(140717579268552, 140717588844616)   
浅拷贝:
>>> lb = copy.copy(l)
>>> id(l[0][0]),id(lb[0][0])     #指向相同的内存空间
(140717579268552, 140717579268552)

14. 可变数据类型和不可变数据类型

可变数据类型:list是可变数据类型;<有增删改查>列表
不可变数据类型:数值类型, 字符串, bool

二.集合

1.集合的特性:

集合的特性:不支持:(索引, 切片, 重复, 连接,) 因为无序; 
支持:成员操作符 for循环。
s = {2,5,8,20}
print(1 in s)

for i  in s:
    print(i, end=',')
集合是无序的数据类型: 添加元素的顺序和存储的顺序无关;
添加:
s = {2,5,8,20}
s.add(4)
print(s)

这里写图片描述

2.集合的增删改查

s = {1,2,'d', 3,'c', 'f'}

# 增加单个元素;
s.add(4)
print(s)

# 增加多个元素;
s.update({4, 5, 6})
print(s)


# 删除指定元素
s.remove(1)
print(s)

# 随机删除集合元素
s.pop()
print(s)
# 清空集合
s.clear()
print(s)

这里写图片描述

3. 集合操作

s1 = {1, 2, 3}
s2 = {1, 2, 4}

1.交集
print(s1.intersection(s2))
print(s1 & s2)             

2.并集
print(s1.union(s2))
print(s1 | s2)

3.差集
print(s1.difference(s2))
print(s2.difference(s1))

print(s1 - s2)
print(s2 - s1)

4.对等差分:将两个集合的不同的部分拿出来放一起。
print(s1.symmetric_difference(s2))
print(s1^s2)

s3 = {1,2}
s4 = {1,2,3}

5.s3是s4的子集?
print(s3.issubset(s4))

6.s3是s4的父集?
print(s3.issuperset(s4))

7.s1和s2没有交集么? 如果没有交集True,否则返回False;
print(s3.isdisjoint(s2))

这里写图片描述

示例1:

1. 共同好友;
        你的好友A,B,C 他的好友C,B,D, 求共同好友:
 me = {'A','B','C'}
ta = {'C','B','D'}
gongtonghaoyou = me & ta
print(gongtonghaoyou)

2.   微信群提醒:
        小明与群里其他人都不是微信朋友关系
#不是朋友关系与任何人都没有交集
执行结果:共同好友为

这里写图片描述

示例2:

2. 权限判断:
         有一个API,要求同时具备A,B,C权限才能访问,目前用户权限为B,C,D,判断该用
户能否访问该API;

# 实质看用户权限是否为ABC的父集:

API = {'A','B','C'}
yonghu = {'B','C','D'}
print(yonghu.issuperset(API))    
#用户权限是否是API权限的父集,数出True,可以访问,False不能访问。                    

这里写图片描述

示例3:

 集合练习:
1.随机产生2组各个数字的列表,每组10个数字,如下要求:
每个数字取值范围[10,20]
#生成随机数:
import random   #导入模块(生成随机数)
num1 = []
num2 = []
n = 10
for i in range(n):
    item1 = random.randint(10,20)
    item2 = random.randint(10,20)
    num1.append(item1)
    num2.append(item2)
print(num1)
print(num2)
2.统计20个数字中,一共有多少个不同的数字?   #求并集
  print(len(set(num1) | set(num2))) 
3.2组中,不重复的数字有几个?分别是什么?   #求对等差分
 print(len(set(num1)^set(num2)))    #个数
print(set(num1)^set(num2))          #分别是
4.2组中,重复的数字有几个?分别是什么?    #求交集
print(len(set(num1)&set(num2)))
print(set(num1)&set(num2))

执行结果:

这里写图片描述

示例4:

 一个总任务列表,储存所有任务,一个完成的任务列表。找出未完成的任务; # 实质上是求差集的。
all_task = ['task1', 'task2', 'task3']
complete = ['task1']
print("未完成任务:%s" %(set(all_task) - set(complete)))

执行结果:

这里写图片描述

示例5:

# 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,
# 他先用计算机生成了N个1到1000之间的随机整数(N≤1000), N是用户输入的,对于
# 其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应
# 着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺
# 序去找同学做调查。请你协助明明完成“去重”与“排序”的工作;

# 在1-1000之间随机生成10个数字

# 导入随机数模块
import random
# 用户输入的数:
N = int(input('num:'))
# 创建空集合
s = set()
# for循环,生成随机数
for i in range(N):     
    item = random.randint(1,1000)
    s.add(item)
# 对于集合进行排序
print(sorted(s))

去重排序结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值