列表

# -*- 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
  • 列表推导式

  1. 使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性
# 语法:[返回表达式 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]
  1. 列表推导式的嵌套
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']
  1. 过滤不符合条件的元素
# [返回表达式 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']
请输入要查看的页码:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358