学习python的第五天

列表的运算

1. 列表的重复

list1 = [1,2,3,4]
print(list1 * 3)
# [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]

2. 列表的拼接

list1 = [1,2,3,4]
list2 = [5,6,7,8]
print(list1 + list2)
# [1, 2, 3, 4, 5, 6, 7, 8]

3. 成员运算:in、not in

成员运算结果是布尔值

print(3 in [1, 2, 3])     #True
print([3] in [1, 2, 3])   #Flase
print([3] in [1,2,3,[3]]) #True

4. 比较大小

a.比较大小的元素必须是同类型的。

b.比较大小比较的是第一对不相等元素的大小(容器)。

c.数字正常比较大小。

list1 = [1,2,3,4]
list3 = [1,2,4,5]
print(list1 < list3)
# True
list1 = [1,2,'3',4]
list3 = [1,2,'4',5]
print(list1 < list3)
# True
list1 = ['1',2,'3',4]
list3 = [1,2,'4',5]
print(list1 < list3)
# TypeError: '<' not supported between instances of 'str' and 'int'
#不符合条件a

练习:有两个列表A和B,使用列表C来获取两个列表中公共的元素
例如: A = [1, ‘a’, 4, 90] B = [‘a’, 8, ‘j’, 1] --> C = [1, ‘a’]

A = [1, 'a', 4, 90]
B = ['a', 8, 'j', 1]
C = []
for i in A:
    if i in B:
        C.append(i)
print(C)
# [1, 'a']

列表的方法和函数

1. max、min—获取同类型数据中最大最小值

num = [31,12,22,15]
print(max(num))
print(min(num))
# 31
# 12

2. count —统计某个元素出现个数

num = [31,12,22,15]
print(num.count(15))
print(num.count(5))
# 1
# 0

3. sum —求和

num = [31,12,22,15]
print(sum(num))
# 80

4. reverse—将列表倒序输出

修改原列表,返回值为None,直接修改列表本身

num = [31,12,22,15]
print(num.reverse())
print(num)
# None
# [15, 22, 12, 31]

创建一个新列表存储倒序后的数据。

num = [15, 22, 12, 31]
print(num[::-1])
print(num)
# [31, 12, 22, 15]
# [15, 22, 12, 31]

5. sorted(列表,默认:reverse = Flase):将列表从小到大排序,生成新列表

num = [15, 22, 12, 31]
print(sorted(num))
print(sorted(num,reverse=True))
print(num)
# [12, 15, 22, 31]
# [31, 22, 15, 12]
# [15, 22, 12, 31]

6. sort:将列表从小到大排序,修改原列表

num = [15, 22, 12, 31]
print(num.sort(reverse=True))
print(num)
print(num.sort())
print(num)
# None
# [31, 22, 15, 12]
# None
# [12, 15, 22, 31]

7. extend():将一个容器中的元素添加到列表中

num = [12, 15, 22, 31]
num.extend('absns')
num.extend([1,2,3])
print(num)
# [12, 15, 22, 31, 'a', 'b', 's', 'n', 's', 1, 2, 3]

8. index():查找元素

从左向右查找,找到元素立刻停止,返回下标。

如果查找元素不存在,报错。

num = [12, 15, 22, 31, 'a', 'b', 's', 'n', 's', 1, 2, 3]
index1 = num.index('s')
print(index1)
# 6

查找第二个‘s’的下标

num = [12, 15, 22, 31, 'a', 'b', 's', 'n', 's', 1, 2, 3]
# 指定从下标为7的位置开始查找
index1 = num.index('s',7)
print(index1)
# 8

练习:不使用index(),查找第二个a的下标。

num = [12, 15, 22, 31, 'a', 'b', 's', 'n', 's', 1, 2, 3]
a_count = 0
for i in range(len(num)):
    if num[i] == 's':
        a_count += 1
        if a_count == 2:
            print(i)
            break
# 8

列表去重

例:去除一个列表中的重复数据,如:names = [‘张三’, ‘李四’, ‘大黄’, ‘张三’,‘张三’,‘李四’,‘李四’] -> names = [‘张三’, ‘李四’, ‘大黄’]

法一:利用成员运算

names = ['张三', '李四', '大黄', '张三','张三','李四','李四']
name_list = []
for i in names:
    if i not in name_list:
        name_list.append(i)
print(name_list)
# ['张三', '李四', '大黄']

法二:负向删除

names = ['张三', '李四', '大黄', '张三','张三','李四','李四']
for i in range(len(names)-1,-1,-1):
    print(i,names)
    if names.count(names[i]) > 1:
        del names[i]
print(names)
# 6 ['张三', '李四', '大黄', '张三', '张三', '李四', '李四']
# 5 ['张三', '李四', '大黄', '张三', '张三', '李四']
# 4 ['张三', '李四', '大黄', '张三', '张三']
# 3 ['张三', '李四', '大黄', '张三']
# 2 ['张三', '李四', '大黄']
# 1 ['张三', '李四', '大黄']
# 0 ['张三', '李四', '大黄']
# ['张三', '李四', '大黄']

法三:使用index标记。

names = ['张三', '李四', '大黄', '张三','张三','李四','李四']
index = 0
while index <= len(names) - 1:
    if names.count(names[index]) > 1:
        del names[index]
    else:
        index += 1
print(names)
# ['大黄', '张三', '李四']

列表推导式

作用:生成一个有元素的列表

语法一:[表达式 for 变量 in 容器]

for循环每执行一次,表达式就会将其生成的成果添加到列表中。

num = [i for i in range(1,11)]
print(num)
num_2 = [1 for _ in range(10) ]
print(num_2)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

append()适用于所有向列表中追加元素的操作。
列表推导式在某些情况下可以替代append()。
性能:列表推导式 > append()

列表推导式和append性能对比

import time
start = time.time()
list1 = []
for i in range(1,100000001):
    list1.append(i)
end = time.time()
print(f'append方法一共花费{end-start}秒')
# append方法一共花费12.64517068862915秒
import time
start = time.time()
list2 = [i for i in range(1,100000001)]
end = time.time()
print(f'列表推导式一共花费{end-start}秒')
# 列表推导式一共花费9.833498239517212秒

语法二:[表达式 for 变量 in 容器 if 条件]

for循环执行一次,if分支判断一次,条件成立时表达式执行。

list3 = [i for i in range(1,101) if i % 2 == 0]
print(list3)
# [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

语法三:[表达式 for 变量 in 容器 for 变量 in 容器 ]

list4 = [j for i in range(3) for j in range(1,11)]
print(list4)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

练习:找出100以内所有上午孪生数。孪生数:两个素数的差等于2。

法一:

num = []
for i in range(2,101):
    if i == 2:
        num.append(i)
    else:
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            num.append(i)
print(num)
list5 = [f'{num[a]}{num[a+1]}是孪生数' for a in range(len(num)-1) if num[a+1]-num[a] == 2]
print(list5)
# [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
# ['3和5是孪生数', '5和7是孪生数', '11和13是孪生数', '17和19是孪生数', '29和31是孪生数', '41和43是孪生数', '59和61是孪生数', '71和73是孪生数']

法二:

num1 = [i for i in range(2,100) for j in range(2,i) if i % j == 0]
num2 = [i for i in range(2,101) if i not in num1]
num = [[num2[i],num2[i + 1]] for i in range(len(num2) - 1) if num2[i + 1] - num2[i] == 2]
print('孪生数为:',end = ' ')
for i in num:
    print(f'{i[0]}{i[1]}' , end = ' ')
# 孪生数为: 3和5 5和7 11和13 17和19 29和31 41和43 59和61 71和73 

随机模块

random:随机模块。如:俄罗斯轮盘、抽奖等。

randint(a,b) : 从闭区间[a,b]中随机获取一个整数。
randrange() : 约等于randint + range。
import random
print(random.randrange(1,4,2))
# 1 或者 3
choice() : 从容器中随机获取一个元素
import random
print(random.choice([1, 2, 3, 4]))
# 3
choices() : 从容器中随机获取k个元素,有放回的抽取元素。
import random
print(random.choices([1,2,3,4],k=3))
# [1, 4, 3]
sample() : 从有序容器中无放回的抽取(k个)元素。
import random
print(random.sample([1,2,3,4,5,6,7,8],k=3))
# [1, 5, 4]
shffule() : 将有序容器随机打乱顺序
import random
list1 = [1,2,3,4,5,6,7,8]
print(random.shuffle(list1))
print(list1)
# [1, 8, 4, 3, 7, 2, 6, 5]

练习:课堂随机点名器

import random
names = ['小红','小明','小潘','小邹']
random.shuffle(names)
result = random.choices(names,k=1)
print(f'被抽中的同学为:{result}')
# 被抽中的同学为:['小潘']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值