2、列表

列表

列表的特点:

  • 有序;
  • 编号,可以通过编号访问;
  • 可遍历;
  • 可追加/可插入;
  • 可删除/可弹出;
  • 可修改;
  • 长度不定
# coding: utf-8
users = ['HL', 10, 20.3, True, False, [1, 2, 3]]
# 遍历列表users
for name in users:
    print(name)

# type查看数据类型
print(type(users))

# 打印列表第一个元素,索引为0
print(users[0])

# 打印列表第三个元素,索引为2
print(users[2])

# 打印列表最后一个元素,索引为-1
print(users[-1])

# 打印列表最后二个元素,索引为-2
print(users[-2])

# 修改索引为"1"的值
users[1] = 'Fish'
print(users)

list() 方法用于将可迭代对象转换为列表

print(list('1234567'))
print(list('abcdefg'))

# str是可迭代对象,int、float不是
# print(list(4.5)) 错误
# print(list(123456)) 错误

range() 函数可创建一个整数列表

  • range(start, stop, step)
  • 默认start=0,步长step=1
print(list(range(10)))
for i in range(10):
    print(i)

print(list(range(0, 10)))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(list(range(1, 10, 2)))
# [1, 3, 5, 7, 9]

print(list(range(9, 2, -3)))
# [9, 6, 3]

作业1:打印乘法口诀

  • 提示:使用for
for column in range(1, 10):
    for row in range(1, 10):
        if row <= column:
            print('%d * %d = %2d' % (row, column, row * column), end='\t')
    print('\n')

作业2:nums2 = [6, 11, 7, 9, 4, 2, 1]列表中找到最大的

  • 从nums中拿到第一个数字放到变量hand中
  • 从第二个元素开始比较,如果比hand值大,则从新赋值
nums2 = [6, 11, 7, 9, 4, 2, 1]
hand = nums2[0]
for i in nums2:
    if hand < i:
        hand = i
print(hand)

# 变量hand为None,None => 什么都没有
# 从第一个元素开始比较,如果hand为None或者比hand值小,则从新赋值

nums2 = [6, 11, 7, 9, 4, 2, 1]
hand = None
for i in nums2:
    if hand is None or hand > i:
        hand = i
print(hand)

作业3:冒泡排序

  • 移动nums中最大的数字到最后
  • 提示:从左到右依次两两比较,如果前面比后面大,则交换位置。
  • 第一次:6和11比较,前面小不交换,[6, 11, 7, 9, 4, 2, 1]
  • 第二次:11和7比较,前面大交换,[6, 7, 11, 9, 4, 2, 1]
  • 第三次:11和9比较,前面大交换,[6, 7, 9, 11, 4, 2, 1]
  • 第四次:11和4比较,前面大交换,[6, 7, 9, 4, 11, 2, 1]
  • 第五次:11和2比较,前面大交换,[6, 7, 9, 4, 2, 11, 1]
  • 第六次:11和1比较,前面大交换,[6, 7, 9, 3, 2, 1, 11]

交换方法

  • tmp = a; a = b; b = tmp
  • a, b = b, a
'''
思路:
1、比较多少次 n-1
2、依次两两比较
for i in range(n-1)
    nums[i], nums[i+1] = nums[i+1], nums[i]
3、如何进行交换
    (1)tmp = a; a = b; b = tmp
    (2)a, b = b, a
'''
nums2 = [6, 11, 7, 9, 4, 2, 1]
hand2 = nums2[0]

for j in range(len(nums2)-1):
    for i in range(len(nums2)-1):
        if nums2[i] > nums2[i+1]:
            nums2[i], nums2[i+1] = nums2[i+1], nums2[i]
    print(nums2)

获取list特殊值

# 获取list元素的数量
print(len(nums2))

# 获取list元素中的最大值和最小值
print(max(nums2))
print(min(nums2))

# 判断元素是否在list中存储
print(1 in nums2)
print(1 not in nums2)
print(12 in nums2)

赋值交换

x, y, z = 3, 6, 9
print(x, y, z)
x, y, z = y, z, x
print(x, y, z)

列表四则运算

nums2 += nums2
print(nums2)
nums3 = nums2 + [0, 0, 0]
print(nums3)
nums4 = nums2 * 2
print(nums4)

切片

  • 按照规则获取list中一部分元素生成新的list
'''
list[start:end:step]
list[::step]
list[start:end]
list[:end]
list[start:]
list[:]
'''
nums5 = list(range(10))
print(nums5[1:9:2])
# [1, 3, 5, 7]

print(nums5[::5])
# [0, 5]

print(nums5[1:5])
# [1, 2, 3, 4]

print(nums5[:5])
# [0, 1, 2, 3, 4]

print(nums5[5:])
# [5, 6, 7, 8, 9]

print(nums5[:])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 翻转list
print(nums5[::-1])
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

print(nums5[5::-1])
# [5, 4, 3, 2, 1, 0]

# 翻转list
print(nums5[::-1])
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

print(nums5[5::-1])
# [5, 4, 3, 2, 1, 0]

# 获取所有偶数索引
print(nums5[::2])
# [0, 2, 4, 6, 8]

# 获取所有奇数索引
print(nums5[1::2])
# [1, 3, 5, 7, 9]

# 获取所有倒序的奇数索引
print(nums5[::-2])
# [9, 7, 5, 3, 1]

# 获取所有倒序的偶数索引
print(nums5[-2::-2])
# [8, 6, 4, 2, 0]

切片复制(详见2.1)

# 对象赋值,直接改变了原来的nums5
nums5 = list(range(10))
nums5_tmp = nums5
nums5_tmp[0] = 'HL'

print(nums5_tmp)
# ['HL', 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(nums5)
# ['HL', 1, 2, 3, 4, 5, 6, 7, 8, 9]

# python提供了一个id()函数,用于查询内存地址
print(id(nums5_tmp))
# 4443399944
print(id(nums5))
# 4443399944

# 复制,使用切片,不会直接改变原来的nums5
nums5 = list(range(10))
nums5_tmp = nums5[:]
nums5_tmp[0] = 'Fish'
print(nums5_tmp)
# ['Fish', 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(nums5)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(id(nums5_tmp))
# 4507257288

print(id(nums5))
# 4507260680

切片对list增删修改

切片的应用

  • 语法:list_name[start:end] = [v_0, v_1, ..., v_n]
    使用list_name[v_0, v_1, ..., v_n]替换切片对应的位置的元素
  • 当切片元素大于[v_0, v_1, ..., v_n]的数量按照顺序替换切片中的元素,切片中多余的元素将删除
  • 当切片元素小于[v_0, v_1, ..., v_n]的数量,按照顺序替换切片中的元素,赋值list中多余的元素则添加到切片最右索引之后
nums5 = list(range(10))

# 对索引1-3进行更改
nums5[1:4] = ['a', 'b', 'c']
print(nums5)
# [0, 'a', 'b', 'c', 4, 5, 6, 7, 8, 9]

# 对索引4-6进行删除
nums5[4:7] = []
print(nums5)
# [0, 'a', 'b', 'c', 7, 8, 9]

# 在索引4处进行添加
nums5[4:4] = ['e', 'f', 'g', 'h']
print(nums5)
# [0, 'a', 'b', 'c', 'e', 'f', 'g', 'h', 7, 8, 9]



# 情况一、将切片中多余的元素删除掉了。原本索引4-7有四个元素,对索引4-7赋了3值,所以多余的元素删除掉了。
print(nums5[4:8])
# ['e', 'f', 'g', 'h']
nums5[4:8] = ['a', 'b', 'c']
print(nums5)
# [0, 'a', 'b', 'c', 'a', 'b', 'c', 7, 8, 9]

# 情况二、在索引list[:4]处依次增加多余的元素。原本索引1-3有3个元素,对索引1-3赋了5个值,依次增加多出来的元素将排在最大索引后面。
print(nums5[1:4])
# ['a', 'b', 'c']
nums5[1:4] = ['e', 'f', 'g', 'h', 'i']
print(nums5)
# [0, 'e', 'f', 'g', 'h', 'i', 'a', 'b', 'c', 7, 8, 9]

列表函数

dir()是查看有哪些函数,help()查询函数的用法

  • append:添加元素到list最右侧
  • clear:清空list中的元素
  • copy:复制list中的所有元素到新list中并返回
  • count:计算list中存在相同元素的数量
  • extend:将一个可遍历数据中的所有元素最佳到list后
  • index:获取元素在list中出现的位置
  • insert:在list指定位置添加元素
  • pop:弹出list中指定位置的元素(默认最右侧)
  • remove:移除list中指定的元素
  • reverse:对list中元素进行反转
  • sort:对list中元素进行排序
  • 查看帮助
# dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
print(dir(list))

# help() 函数用于查看函数或模块用途的详细说明。
print(help(list.append))
print(help(list.clear))
  • append:添加元素到list最右
nums6 = list(range(5))

nums6.append('abc')
print(nums6)
# [0, 1, 2, 3, 4, 'abc']
nums6.append(['abc'])
print(nums6)
# [0, 1, 2, 3, 4, 'abc', ['abc']]
nums6.append([1, 2, 'abc'])
print(nums6)
# [0, 1, 2, 3, 4, 'abc', ['abc'], [1, 2, 'abc']]
  • extend:将一个可遍历数据中的所有元素最佳到list后
nums6 = list(range(5))
nums6.extend('abc')
print(nums6)
# [0, 1, 2, 3, 4, 'a', 'b', 'c']
nums6.extend(['abc'])
print(nums6)
# [0, 1, 2, 3, 4, 'a', 'b', 'c', 'abc']
nums6.extend([1, 2, 'abc'])
print(nums6)
# [0, 1, 2, 3, 4, 'a', 'b', 'c', 'abc', 1, 2, 'abc']
  • append会将添加的list当成一个整体添加到list中去;append 接受一个参数,这个参数可以是任何数据类型,并且简单地追加到 list 的尾部。
  • extend是将添加的list当成单独的元素添加到list中;extend 接受一个参数,这个参数总是一个 list,并且把这个 list 中的每个元素添加到原 list 中。
  • clear:清空list中的元素
nums6 = list(range(5))
nums6.clear()
print(nums6)
# []

# 和切片清空的方式对比
nums6 = list(range(5))
nums6[:] = []
print(nums6)
# []
  • copy:复制list中的所有元素到新list中并返回,详见2.1Python深拷贝与浅拷贝。
nums6 = list(range(5))
print(nums6)
nums7 = nums6.copy()
print(nums7)
nums7[1] = 'HL'
print(nums7)
print(nums6)

# 和切片复制的方式对比
nums6 = list(range(5))
print(nums6)
nums7 = nums6[:]
nums7[1] = 'Fish'
print(nums7)
print(nums6)
  • count:参数是任意类型,返回值是int类型,获取元素在list中出现的次数,list中没有时,返回0。
nums6 = list(range(5))
print(nums6)

nums6.extend([2])
nums6.extend([2, 2])
nums6.extend('22')
nums6.append(22)
nums6.append('22')
print(nums6)
# [0, 1, 2, 3, 4, 2, 2, 2, '2', '2', 22, '22']

print(nums6.count(2))
# 4
print(nums6.count('2'))
# 2
print(nums6.count('a'))
# 0
  • index:参数是任意类型,返回值是int类型,获取元素在list中出现的位置,不存在则报错,可以指定查找list的start和end范围。
  • str.index(str, beg=0, end=len(string))
print(nums6.index(2))
# 2
print(nums6.index('2'))
# 8
print(nums6.index('2', 9))
# 9
  • pop:参数是整数,返回值是从list中弹出的元素。根据索引删除list中的元素,并返回,若索引不存在,则报错。pop默认是从最右侧删除。
print(nums6)
# [0, 1, 2, 3, 4, 2, 2, 2, '2', '2', 22, '22']

nums6.pop()
print(nums6)
# [0, 1, 2, 3, 4, 2, 2, 2, '2', '2', 22]

nums6.pop(0)
print(nums6)
# [1, 2, 3, 4, 2, 2, 2, '2', '2', 22]

nums6.pop(6)
print(nums6)
# [1, 2, 3, 4, 2, 2, '2', '2', 22]
  • remove:参数是任意类型,没有返回值。从list中删除指定的值(第一次出现的元素),若值不存在,则报错。
nums6.remove('2')
print(nums6)
# [1, 2, 3, 4, 2, 2, '2', 22]

# 删除列表中元素
# 根据索引删除列表中元素
del nums6[0]
print(nums6)
# [2, 3, 4, 2, 2, '2', 22]

del nums6[-1]
print(nums6)
# [2, 3, 4, 2, 2, '2']

  • 堆栈:先入后出
  • append:从最右侧添加
  • pop():从最右侧删除
  • 队列:先入先出
  • append:从最右侧添加
  • pop(0):从最左侧删除
  • reverse:对list中元素进行反转。参数类型无,返回值无。
nums6 = list(range(5))
nums6.reverse()
print(nums6)
# [4, 3, 2, 1, 0]

# 和切片对比
nums6 = list(range(5))
nums7 = nums6[::-1]
print(nums7)
# [4, 3, 2, 1, 0]
  • sort:排序规则,是否反转。返回值无。对list中元素进行排序。
nums7.sort()
print(nums7)
# [0, 1, 2, 3, 4]
  • insert:当索引大于或小于list原本的索引时,则在list对应的两端增加元素。索引不存在不会报错。
nums7.insert(-1000, 520)
print(nums7)
# [520, 0, 1, 2, 3, 4]

nums7.insert(10000, 'LOVE')
print(nums7)
# [520, 0, 1, 2, 3, 4, 'LOVE']
  • 练习1、todolist
  • 提示用户输入do或者任务(非do)
  • 如果用户输入任务,则添加到list中
  • 如果用户输入do,当任务为空时,则打印无任务并退出,否则从list中根据先进先出原则打印任务。
  1. 存储所有的任务用list,tasks
  2. while循环
  3. input
  4. 输入非do,append
    输入do,按照先进先出的原则,(检查list是否为空,为空则打印无任务并打印退出)把任务弹出,并打印
tasks = []
while True:
    tasks_name = input('Please input do or your a tasks:')
    if tasks_name == 'do':
        if len(tasks) == 0:
            print('Tasks is None.')
            break
        else:
            print(tasks.pop(0))
    elif len(tasks_name) == 0:
        continue
    else:
        tasks.append(tasks_name)
        print(tasks)
  • 练习2、获取两个list中相同的元素到第三个列表中
  • nums8 = [1, 2, 3, 4, 5, 3, 10, 11]
  • nums9 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
  • 保证第三个list中元素不重复
  1. 定义第三个list,nums10
  2. 对第一个list进行遍历
  3. 从第一个list中依次取元素,和第二个list的对比
    重复的放到第三个list
print('###### my execrcises ######')
nums10 = []
nums8 = [1, 2, 3, 4, 5, 3, 10, 11]
nums9 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
for i in nums8:
    if nums9.count(i) > 0 and nums10.count(i) == 0:
        nums10.append(i)
print(nums10)

print('###### teacher execrcises ######')
result = []
nums8 = [1, 2, 3, 4, 5, 3, 10, 11]
nums9 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
for i in nums8:
    if i in nums9 and i not in result:
        result.append(i)
print(result)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • 数据结构,是指通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可...
    千释炎阅读 774评论 0 0
  • 你在看,我在读 前方施工,暂停 谁家的窗,树影婆娑 倒映下的星空 生命 夕阳一线牵 归家 井盖的静谧 路人啊,你在...
    机长_阅读 225评论 0 1
  • 就想写点什么,但也不知道该写 些什么,总有很多想法,但也总是没有执行! 写写来到这个世上,我所知道的事与人吧,不是...
    艾微Jennifer阅读 202评论 0 0
  • 2002年的端午,我的孩子,你----滢滢呱呱坠地。 喜悦之情难以言表,初为人父的我甚至显得惊慌,看着...
    清泉上石阅读 150评论 0 1