# -*- coding: utf-8 -*-
# @Time : 2019/11/6 9:07
# @Author : John
# @Email : 2398344557@qq.com
# @File : 列表.py
# @Software: PyCharm
一个列表中的数据类型可以各不相同,可以同时分别为整数、实数、字符串等基本类型,甚至是列表、字典以及其他自定义类型的对象。
例:
a = [1,2,3,2.4,5]
b = [0.01,"zhangsan",[1,2,3]]
- 列表是Python中内置有序可变排序
- 所有元素放在[]中,用逗号隔开
-
创建列表
# 使用“=”直接将一个列表赋值给变量即可创建列表对象
list1 = ['花木兰', '百里守约', '凯', '百里玄策', '苏烈', ['宫本武藏', '不知火舞', '娜可露露', '橘右京'], 88.88]
print(len(list1))
—— 7
# -------------------
# ***拓展***
# 使用list()函数将元组、range对象、字符串或其他类型的可迭代对象类型的数据转换为列表
print(list("Hello"))
—— ['H','e','l','l','o']
-
列表的访问
# 查看番邦英雄:
print(list1[5])
—— ['宫本武藏', '不知火舞', '娜可露露', '橘右京']
# 查看宫本武藏:
print(list1[5][0])
—— 宫本武藏
-
列表的添加
# append(object)内置函数:向列表尾部添加一个元素,不改表其内存首地址,属于原地操作(容器增长不变胖)(超兽神合体)(常用)
# append()类似于贪食蛇进食
list1.append(['1', '2', '3'])
print('用append()给列表添加元素为:{}'.format(list1))
—— ['花木兰', '百里守约', '凯', '百里玄策', '苏烈', ['宫本武藏', '不知火舞', '娜可露露', '橘右京'], 88.88, ['1', '2', '3']]
# —— 用append()给列表添加元素为:['花木兰', '百里守约', '凯', '百里玄策', '苏烈', ['宫本武藏', '不知火舞', '娜可露露', '橘右京'], 88.88, ['1', '2', '3']]
# -------------------------------------------------------
# insert(index, object)内置函数:向列表任意位置插入一个元素,不改变其内存首地址,输入原地操作(插队操作)(少用)
list1.insert(0, {'今天天气不错': '晴天'})
print('用insert()给列表添加元素为:{}'.format(list1))
—— [{'今天天气不错': '晴天'}, '花木兰', '百里守约', '凯', '百里玄策', '苏烈', ['宫本武藏', '不知火舞', '娜可露露', '橘右京'], 88.88, ['1', '2', '3']]
# —— 用insert()给列表添加元素为:[{'今天天气不错': '晴天'}, '花木兰', '百里守约', '凯', '百里玄策', '苏烈', ['宫本武藏', '不知火舞', '娜可露露', '橘右京'], 88.88, ['1', '2', '3']]
# 当输入的索引值大于列表的索引时,只会在列表最后添加,但不会报错;反之小于时,会在最前面添加
# 注:当输入的索引值为“-(元素个数)”时,会在相应位置插队添加进列表。因为列表最后一个元素的索引值为-1,由此类推。
# -------------------------------------------------------
—— [{'今天天气不错': '晴天'}, '花木兰', '百里守约', '凯', '百里玄策', '苏烈', ['宫本武藏', '不知火舞', '娜可露露', '橘右京'], 88.88, ['1', '2', '3'], 3, 4, 5]
# extend()内置函数:将另一个迭代对象的所有元素添加至该列表对象的尾部,不改变其内存首地址,属于原地操作。(以单个元素形式逐个添加,长度大大增加)(少用)
list1.extend([3, 4, 5])
print('用extend()给列表添加元素为:{}'.format(list1))
——
# —— 用extend()给列表添加元素为:[{'今天天气不错': '晴天'}, '花木兰', '百里守约', '凯', '百里玄策', '苏烈', ['宫本武藏', '不知火舞', '娜可露露', '橘右京'], 88.88, ['1', '2', '3'], 3, 4, 5]
-
列表的 + 和 *
# + 是连接两个列表
# * 是复制列表
x = [1, 2, 3]
y = x + [4]
print(y)
—— [1, 2, 3, 4]
y = x * 2
print(y)
—— [1, 2, 3, 1, 2, 3]
# 结论:这两个操作并非为列表添加元素,而是创建一个新的列表,不属于原地操作,返回的是一个新的列表
-
列表元素的删除
# pop(index)内置函数:删除且可返回指定(默认是最后一个)位置元素。如果pop()中输入的索引值超过list范围时,会报错
x = [1, 2, 3, 4]
x.pop()
print('删除后的x:{}'.format(x))
—— 删除后的x:[1, 2, 3]
value = x.pop(1)
print('返回pop(1)的值:{}'.format(value))
—— 返回pop(1)的值:2
print('再删除pop(1)后的x:{}'.format(x))
—— 再删除pop(1)后的x:[1, 3]
# -------------------------------------------------------
# remove(object)内置函数:删除首次出现的指定元素,如果列表中不存在要删除的元素,则抛出异常
x = [1, 2, 2, 3, 4, 2, '5']
x.remove(5)
—— list.remove(x): x not in list
x.remove(2)
print('remove()删除指定元素后:{}'.format(x))
—— remove()删除指定元素后:[1, 2, 3, 4, 2, '5']
# -------------------------------------------------------
# clear()内置函数:清空列表
x = [1, 2, 2, 3, 4, 2, '5']
x.clear()
print(x)
—— []
# -------------------------------------------------------
# # del 列表名[index]:删除列表中的指定位置的元素,如果超出索引范围,则抛出异常
x = [1, 2, 2, 3, 4, 2, '5']
del x[6]
print(x)
—— list assignment index out of range
del x[0]
print('del删除元素后:{}'.format(x))
—— del删除元素后:[2, 2, 3, 4, 2, '5']
del x # 整个列表删得“骨头都不剩”
print(x)
NameError: name 'x' is not defined
-
列表元素的计数
# 列表名.count(object):count()内置函数统计指定元素在列表中出现的次数
x = [1, 2, 2, 3, 4, 2, '5']
print(x.count(2))
—— 3
print(x.count('5'))
—— 1
print(x.count(0))
—— 0
# 结论,不存在该元素时也不会报错,只会返回0。
-
获取索引值(下标)
# index()内置函数:获取指定元素首次出现的下标,若列表对象中不存在指定元素,抛出异常
x = [1, 2, 2, 3, 4, 2, '5']
print(x.index(2))
—— 1
print(x.index(6)) # 报错
—— 6 is not in list
print(x.index(4, 2, 4)) # 报错
—— 4 is not in list
print(x.index(2, 2, 4))
—— 2
-
测试元素是否存在列表中
# in 测试列表中是否含有该元素,返回bool类型
x = [1, 2, 2, 3, 4, 2, '5']
print(5 in x)
—— False
print(2 in x)
—— True
# not in 测试列表中是否不含有该元素,返回bool类型
print(5 not in x)
—— True
print(1 not in x)
—— False
# 列表的排序
# 列表的内置方法:
# sort()内置函数:列表名.sort()
list2 = []
for x in range(15):
list2.insert(x, x)
print('使用insert()创建列表:', list2)
—— 使用insert()创建列表: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
list3 = []
for x in range(15):
list3.extend([x])
print('使用extend()创建列表:', list3)
—— 使用extend()创建列表: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
list4 = []
for x in range(15):
list4.append(x)
print('使用append()创建列表:', list4)
—— 使用append()创建列表: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
# 打乱顺序
from random import shuffle
shuffle(list2)
print('打乱循序后的list2为:{}'.format(list2))
—— 打乱循序后的list2为:[10, 8, 13, 3, 7, 6, 9, 2, 14, 12, 5, 11, 0, 4, 1]
list2.sort()
print('重新正常排序的list2为:{}'.format(list2))
—— 重新正常排序的list2为:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
list2.sort(reverse=True)
print('重新倒叙排序的list2为:{}'.format(list2))
—— 重新倒叙排序的list2为:[14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# ***拓展***
# -----------------------------------
# reverse()内置函数:将列表的所有元素原地逆序排序
shuffle(list3)
print('打乱循序后的list3为:{}'.format(list2))
—— 打乱循序后的list3为:[14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
list3.reverse()
print('使用reverse()逆序排序后的list3:{}'.format(list2))
—— 使用reverse()逆序排序后的list3:[14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# ***拓展***
# -----------------------------------
# sorted()内置函数:对列表进行排序并且返回新的列表,不对原来列表进行修改
list3 = sorted(list3)
print('使用sorted()排序后的list3为:{}'.format(list3))
—— 使用sorted()排序后的list3为:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
# ***拓展***
# -----------------------------------
# reversed()内置函数
shuffle(list4)
print('打乱循序后的list4为:{}'.format(list4))
—— 打乱循序后的list4为:[6, 13, 14, 0, 10, 5, 9, 2, 12, 7, 11, 4, 1, 8, 3]
list4 = reversed(list4) # 此处返回的是迭代对象(引用地址),知道类型之后用相应的类型转换即可输出
print('使用reversed()逆序排序后的list4:{}'.format(list4))
—— 使用reversed()逆序排序后的list4:<list_reverseiterator object at 0x000000CA438B75F8>
list4 = list(list4)
print('使用reversed()逆序排序后的list4:{}'.format(list4))
# print(list(reversed(list4))) # 或者直接一句话搞掂
—— [3, 8, 1, 4, 11, 7, 12, 2, 9, 5, 10, 0, 14, 13, 6]
-
遍历列表的三种方式
# 第一种:
l1 = ['a', 'b', 'c', 'd', 'e']
print('直接遍历列表里的每个元素:')
for x in l1:
print(x)
—— 直接遍历列表里的每个元素:
a
b
c
d
e
# 第二种:
print('')
print('根据列表长度来遍历列表:')
for i in range(len(l1)):
print(l1[i])
—— 根据列表长度来遍历列表:
a
b
c
d
e
# 第三种:
print('')
print('根据枚举所返回的元组中对应的索引值来遍历元素本身:')
for x in enumerate(l1):
print(x[1])
—— 根据枚举所返回的元组中对应的索引值来遍历元素本身:
a
b
c
d
e
print('')
print('根据枚举所返回的元组后再进行拆包来遍历元素本身{}')
for index, value in enumerate(l1):
print(value)
—— 根据枚举所返回的元组后再进行拆包来遍历元素本身{}
a
b
c
d
e
-
列表推导式
-
使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性
# 语法:[返回表达式 for 临时变量 in 可迭代对象 条件表达式]
# li = []
# for i in range(10):
# li.append(i)
# print('普通生成列表:', li)
# —— 普通生成列表: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 以上步骤用列表推导式表示为:
print('使用列表推导式生成列表:', [i for i in range(10)])
—— 使用列表推导式生成列表: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
列表推导式的嵌套
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = []
for l in L:
for x in l:
result.append(x)
print('把二维列表降维成一个一维列表:', result)
—— 把二维列表降维成一个一维列表: [1, 2, 3, 4, 5, 6, 7, 8, 9]
# ***拓展***
# ----------------------------------
# 使用列表推导式对(二维)列表进行平铺
print('用列表推导式对二维列表进行平铺(默认整数形式输出):', [x for l in L for x in l])
—— 用列表推导式对二维列表进行平铺(默认整数形式输出): [1, 2, 3, 4, 5, 6, 7, 8, 9]
# ***拓展***
# ----------------------------------
# 可转换输出的数据类型:
# 例如输出的数全都为字符串:
print('用列表推导式对二维列表进行平铺(字符串形式输出):', [str(x) for l in L for x in l])
—— 用列表推导式对二维列表进行平铺(字符串形式输出): ['1', '2', '3', '4', '5', '6', '7', '8', '9']
-
过滤不符合条件的元素
# [返回表达式 for 临时变量 in 可迭代对象 条件表达式]
from random import randint
# _ 的目的是增强代码的可读性,告诉读代码的人这里不需要使用临时变量
l2 = [randint(-20, 20) for _ in range(10)]
print('生成一个有10个数的随机数列表:', l2)
—— 生成一个有10个数的随机数列表: [8, 4, -14, 9, -11, -9, -3, -5, -19, 11]
# 使用列表推导式筛选出所有大于0的元素
print('筛选后的列表:', [element for element in l2 if element >0])
—— 筛选后的列表: [8, 4, 9, 11]
# ----------------------------------
# ^^^举一反三^^^
# 使用列表推导式对(二维)列表进行平铺
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print('平铺后的二维列表:', [x for l in L for x in l])
—— 平铺后的二维列表: [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('筛选后的列表:', [x for l in L for x in l if x % 2 == 0])
—— 筛选后的列表: [2, 4, 6, 8]
作业
【作业1】26亿人口
# 我国现有13亿人口,设每年增长0.8%,编写程序,计算多少年后达到26亿?
import math
Current_population = 1300000000
growth_rate = 0.008
# Future_population = Current_population*(1+growth_rate)**n
Future_population = 2600000000
years = math.log(Future_population/Current_population, (1+growth_rate))
print('{}年后达到26亿'.format(years))
—— 86.98951090123288年后达到26亿
【作业2】求1!+2!+3!+4!+5!的和。
math = [1, 2, 3, 4, 5]
sum_row = 1
lists = []
sum_all = 1
for i in math:
for j in range(1, i+1):
sum_row *= j
# print(sum_row)
lists.append(sum_row)
sum_row = 1
# print(lists)
for i in lists:
sum_all += i
print('1!+2!+3!+4!+5!= {}'.format(sum_all))
—— 1!+2!+3!+4!+5!= 154
【作业3】星号三角形:读入一个整数N,N是奇数,输出由星号字符组成的等边三角形
# 要求:第1行1个星号,第2行3个星号,第3行5个星号,依次类推,最后一行共N的星号。
# 输入:3
# 输出:
# *
# ***
N = int(input('请输入一个正的奇数:'))
if N % 2 != 0:
for i in range(1, N+1):
if i % 2 != 0:
if N >= 0:
print(' '*(N+2), end='')
print('* '*i)
N -= 2
效果如下:
请输入一个正的奇数:2
请输入一个正的奇数:3
*
* * *
请输入一个正的奇数:5
*
* * *
* * * * *
请输入一个正的奇数:7
*
* * *
* * * * *
* * * * * * *
【作业4】分页实现内容
# a. 通过for循环创建301条数据,数据类型不限,如:
# zhangsan-1 zhangsan1@neuedu.com pwd1
# zhangsan-2 zhangsan2@neuedu.com pwd2
# zhangsan-3 zhangsan3@neuedu.com pwd3
# ...
# b. 提示用户 请输入要查看的页码,当用户输出指定页码,也显示指定数据
# 注意:每页显示10条数据
#
# 比如:
# 请输入要查看的页码:5
# ['zhangsan41', 'zhangsan41@neuedu.com', 'pwd41']
# ['zhangsan42', 'zhangsan42@neuedu.com', 'pwd42']
# ['zhangsan43', 'zhangsan43@neuedu.com', 'pwd43']
# ['zhangsan44', 'zhangsan44@neuedu.com', 'pwd44']
# ['zhangsan45', 'zhangsan45@neuedu.com', 'pwd45']
# ['zhangsan46', 'zhangsan46@neuedu.com', 'pwd46']
# ['zhangsan47', 'zhangsan47@neuedu.com', 'pwd47']
# ['zhangsan48', 'zhangsan48@neuedu.com', 'pwd48']
# ['zhangsan49', 'zhangsan49@neuedu.com', 'pwd49']
# ['zhangsan50', 'zhangsan50@neuedu.com', 'pwd50']
# 请输入要查看的页码:12
# ['zhangsan111', 'zhangsan111@neuedu.com', 'pwd111']
# ['zhangsan112', 'zhangsan112@neuedu.com', 'pwd112']
# ['zhangsan113', 'zhangsan113@neuedu.com', 'pwd113']
# ['zhangsan114', 'zhangsan114@neuedu.com', 'pwd114']
# ['zhangsan115', 'zhangsan115@neuedu.com', 'pwd115']
# ['zhangsan116', 'zhangsan116@neuedu.com', 'pwd116']
# ['zhangsan117', 'zhangsan117@neuedu.com', 'pwd117']
# ['zhangsan118', 'zhangsan118@neuedu.com', 'pwd118']
# ['zhangsan119', 'zhangsan119@neuedu.com', 'pwd119']
# ['zhangsan120', 'zhangsan120@neuedu.com', 'pwd120']
lists = []
for i in range(302):
lists.append(['zhangsan{}'.format(i), 'zhangsan{}@neuedu.com'.format(i), 'pwd{}'.format(i)])
while True:
page = int(input('请输入要查看的页码:'))
if page == 0:
continue
elif page <= 30 and page > 0:
small_label = 9
for i in range(10):
start_list = page * 10 - small_label
if small_label >= 0:
print(lists[start_list])
small_label -= 1
else:
break
elif page == 31 or page == -1:
print(lists[301])
elif page >= -31 and page < 0:
small_label = 1
for i in range(10):
start_list = (300-((-page)-1)*10)+small_label
if small_label <= 10:
print(lists[start_list])
small_label += 1
else:
break
else:
continue
效果如下:
请输入要查看的页码:0
请输入要查看的页码:32
请输入要查看的页码:-32
请输入要查看的页码:1
['zhangsan1', 'zhangsan1@neuedu.com', 'pwd1']
['zhangsan2', 'zhangsan2@neuedu.com', 'pwd2']
['zhangsan3', 'zhangsan3@neuedu.com', 'pwd3']
['zhangsan4', 'zhangsan4@neuedu.com', 'pwd4']
['zhangsan5', 'zhangsan5@neuedu.com', 'pwd5']
['zhangsan6', 'zhangsan6@neuedu.com', 'pwd6']
['zhangsan7', 'zhangsan7@neuedu.com', 'pwd7']
['zhangsan8', 'zhangsan8@neuedu.com', 'pwd8']
['zhangsan9', 'zhangsan9@neuedu.com', 'pwd9']
['zhangsan10', 'zhangsan10@neuedu.com', 'pwd10']
请输入要查看的页码:-1
['zhangsan301', 'zhangsan301@neuedu.com', 'pwd301']
请输入要查看的页码:31
['zhangsan301', 'zhangsan301@neuedu.com', 'pwd301']
请输入要查看的页码:-2
['zhangsan291', 'zhangsan291@neuedu.com', 'pwd291']
['zhangsan292', 'zhangsan292@neuedu.com', 'pwd292']
['zhangsan293', 'zhangsan293@neuedu.com', 'pwd293']
['zhangsan294', 'zhangsan294@neuedu.com', 'pwd294']
['zhangsan295', 'zhangsan295@neuedu.com', 'pwd295']
['zhangsan296', 'zhangsan296@neuedu.com', 'pwd296']
['zhangsan297', 'zhangsan297@neuedu.com', 'pwd297']
['zhangsan298', 'zhangsan298@neuedu.com', 'pwd298']
['zhangsan299', 'zhangsan299@neuedu.com', 'pwd299']
['zhangsan300', 'zhangsan300@neuedu.com', 'pwd300']
请输入要查看的页码: