Python学习笔记(十六) 列表

举报
菜鸟级攻城狮 发表于 2021/07/06 22:07:38 2021/07/06
【摘要】 史上最为详细的python学习笔记,记录学习过程的知识点和难点

Python3列表

序列是Python中最基本的数据结构。

序列中的每个元素都分配一个数字 -- 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。

Python有6个序列的内置类型,但最常见的是列表和元组。

序列都可以进行的操作包括索引切片检查成员

此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。

列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。

列表的数据项不需要具有相同的类型

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

list1 = ['Google', 'Runoob', 1997, 2000] 

list2 = [1, 2, 3, 4, 5 ] 

list3 = ["a", "b", "c", "d"]

与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。

 

1访问列表中的值

与字符串的索引一样,列表索引从 0 开始,第二个索引是 1,依此类推。

通过索引列表可以进行截取、组合等操作。

实例

#!/usr/bin/python3

list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[0] )
print( list[1] )
print( list[2] )

以上实例输出结果:

red

green

blue

索引也可以从尾部开始,最后一个元素的索引为 -1,往前一位为 -2,以此类推。

实例

#!/usr/bin/python3

list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[-1] )
print( list[-2] )
print( list[-3] )

以上实例输出结果:

black

white

yellow

使用下标索引来访问列表中的值,同样你也可以使用方括号 [] 的形式截取字符,如下所示:

实例

#!/usr/bin/python3

nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(nums[0:4])

以上实例输出结果:

[10, 20, 30, 40]

使用负数索引值截取:

实例

#!/usr/bin/python3 list = ['Google', 'Runoob', "Zhihu", "Taobao", "Wiki"] # 读取第二位 print ("list[1]: ", list[1]) # 从第二位开始(包含)截取到倒数第二位(不包含) print ("list[1:-2]: ", list[1:-2])

以上实例输出结果:

list[1]:  Runoob

list[1:-2]:  ['Runoob', 'Zhihu']

 

2更新列表

你可以对列表的数据项进行修改或更新,你也可以使用append()方法来添加列表项,如下所示:

实例(Python 3.0+)

#!/usr/bin/python3 

 

list = ['Google', 'Runoob', 1997, 2000] 

 

print ("第三个元素为 : ", list[2]) 

list[2] = 2001 

print ("更新后的第三个元素为 : ", list[2])

注意:我们会在接下来的章节讨论append()方法的使用

以上实例输出结果:

第三个元素为 :  1997

更新后的第三个元素为 :  2001

 

3删除列表元素

可以使用 del 语句来删除列表的的元素,如下实例:

实例(Python 3.0+)

#!/usr/bin/python3 

 

list = ['Google', 'Runoob', 1997, 2000] 

 

print ("原始列表 : ", list) 

del list[2] 

print ("删除第三个元素 : ", list)

以上实例输出结果:

原始列表 :  ['Google', 'Runoob', 1997, 2000]

删除第三个元素 :  ['Google', 'Runoob', 2000]

注意:我们会在接下来的章节讨论 remove() 方法的使用

 

4Python列表脚本操作符

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

如下所示:

Python 表达式

结果

描述

len([1, 2, 3])

3

长度

[1, 2, 3] + [4, 5, 6]

[1, 2, 3, 4, 5, 6]

组合

['Hi!'] * 4

['Hi!', 'Hi!', 'Hi!', 'Hi!']

重复

3 in [1, 2, 3]

True

元素是否存在于列表中

for x in [1, 2, 3]: print(x, end=" ")

1 2 3

迭代

 

5Python列表截取与拼接

Python的列表截取与字符串操作类型,如下所示:

L=['Google', 'Runoob', 'Taobao']

操作:

Python 表达式

结果

描述

L[2]

'Taobao'

读取第三个元素

L[-2]

'Runoob'

从右侧开始读取倒数第二个元素: count from the right

L[1:]

['Runoob', 'Taobao']

输出从第二个元素开始后的所有元素

 

>>>L=['Google', 'Runoob', 'Taobao'] 

>>> L[2] 'Taobao' 

>>> L[-2] 'Runoob' 

>>> L[1:] ['Runoob', 'Taobao'] 

>>>

 

列表还支持拼接操作:

>>>squares = [1, 4, 9, 16, 25] 

>>> squares += [36, 49, 64, 81, 100] 

>>> squares [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 

>>>

 

6嵌套列表

使用嵌套列表即在列表里创建其它列表,例如:

>>>a = ['a', 'b', 'c'] 

>>> n = [1, 2, 3] 

>>> x = [a, n] 

>>> x [['a', 'b', 'c'], [1, 2, 3]] 

>>> x[0] ['a', 'b', 'c'] 

>>> x[0][1] 'b'

 

7Python列表函数&方法

Python列表包含以下函数:

序号

函数

1

len(list)
列表元素个数

2

max(list)
返回列表元素最大值

3

min(list)
返回列表元素最小值

4

list(seq)
将元组转换为列表

 

Python列表包含以下方法:

序号

方法

1

list.append(obj)
在列表末尾添加新的对象

2

list.count(obj)
统计某个元素在列表中出现的次数

也可以使用from collections import Counter

Counter(obj)    # 参考链接 

3

list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

4

list.index(obj)
从列表中找出某个值第一个匹配项的索引位置

5

list.insert(index, obj)
将对象插入列表

6

list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值

7

list.remove(obj)
移除列表中某个值的第一个匹配项

8

list.reverse()
反向列表中元素

9

list.sort( key=None, reverse=False)
对原列表进行排序

10

list.clear()
清空列表

11

list.copy()
复制列表

12

sorted(list) 

对所有可迭代的对象进行排序操作。

sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值

而内建函数 sorted 方法返回的是一个新的 list需要一个变量接收返回值而不是在原来的基础上进行的操作。

sorted 语法:

sorted(iterable, cmp=None, key=None, reverse=False)

参数说明:

· iterable -- 可迭代对象。

· cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。

· key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

· reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

返回值

返回重新排序的列表。

增:

1list.append(obj) # 末尾追加

3list.extend(seq) # 扩展

5list.insert(index, obj) # 插入

删:

6list.pop(index = -1) # 弹栈

7list.remove(obj) # 移除

10list.clear() # 清空

改:

 

查:

2list.count(obj) # 计数

4list.index(obj) # 查找下标

其他:

8list.reverse() # 反转

9list.sort(key = None, reverse = False) # 排序(默认升序)

11list.copy() # 复制

8、列表的定义和获取元素

# 列表声明
names = ['Ironman', 'Hulk', 'Superman', 'Spiderman', 'Batman']
film_name = []

# 列表地址
print(id(names))
print(id(film_name))    # 空列表也有地址

# 获取列表元素:下标  索引
print(names[0])
print(names[1])

# 获取第一个元素,与获取字符串下标方式相同
print(names[0])
print(names[-5])

# 获取最后一个元素
print(names[-1])
print(len(names))   # 计算列表长度
print(names[len(names) - 1])

# 结合循环
# 字符串使用循环

for i in 'hello':
    print(i)
print('-----------------')


# 列表使用for循环
for name in names:
    print(name)

# 查询names里面有没有Superman
for name in names:
    if name == 'Superman':
        print('铛铛铛铛,超人登场!')
        break
else:
    print('超人这次没能来拯救世界!')

# 使用in代替for循环
if 'Superman' in names:
    print('铛铛铛铛,超人登场!')
else:
    print('超人这次没能来拯救世界!')

 

brands = ['Hp', 'Dell', 'Thinkpad', '华为', 'Lenovo', 'Mac', '神州']

'''  '''
# 打印列表内容
print(brands)
# 获取列表特定下标的值
print(brands[-1])
# 修改特定下标的值
brands[-1] = 'Hasee'
print(brands)
print('----------------------')

'''  '''
# 修改华为“HUAWEI”
# for brand in brands:
#     if '华为' in brand:
#         brand = 'HUAWEI'  # 只是修改了变量brand的值,而不是列表中的值
#
# print(brands)       # 没有修改成功


#以下标的方式,修改列表中的华为的值为“HUAWEI”
for i in range(len(brands)):    # 遍历列表中的所有值
    if '华为' in brands[i]:
        brands[i] = 'HUAWEI'
        break       # 找到并修改值后,可以使用break不再进行遍历

print(brands)       # 修改成功


'''

删除  del -> delete的缩写 

Python__del__()方法:销毁对象

'''
# 删除列表中的一个特定值
del brands[2]       # 删除Thinkpad
print(brands)

print('---------------------')

# 删除列表中的多个特定值
# 错误演示,for循环删除
# for i in range(len(brands)):
#     if 'Hp' in brands[i] or 'Mac' in brands[i]:
#         del brands[i]
#
# print(brands)       # 报错:IndexError: list index out of range,原因:因为range的值是固定且不能修改的,在删除列表中的值后,range应该-1

# 正确演示:while循环删除

l = len(brands)
i = 0

while i < l:
    if 'Hp' in brands[i] or 'Mac' in brands[i]:
        del brands[i]
        l -= 1

    i += 1

print(brands)       # 删除成功

 

9for x in yif x in yif x == y的区别

'''
for x in y

if x in y

if x == y
的区别
'''

words = ['hello', 'good', 'apple', 'world', 'digit', 'alpha']

w = input('请输入一个单词:')

# if ... in ...
if w in words:
    print('存在单词', w)

# for ... in ...
# 1for  'abc'  in  ['abc', 'python', 'aaa']  遍历字符串abc有没有在列表中
# 2if   'go'   in  'good'  判断字符串go有没有在字符串good
# 3if   'app'  ==  'apple'  判断字符串app是否等于字符串apple

for word in words:      # 1
    if w in word:       # 2
    # if w == word:     # 3
        print('存在单词', w)
        break

# 字符串
if 'good' == 'good':    # == 比较的是两个内容是否相等
    print('相等')

if 'good' in 'goods':   # in:成员运算符,应用在字符串判断,也可以用在[]
    print('相等或包含')

# 列表
# 形式1

i = 1

if 'good' in ['goods', 'good', 'going', 'gone']:
    print('包含good,下标为', i)
    i += 1

# 形式2

i = 1

for w in ['goods', 'good', 'going', 'gone']:    # for ... in ...遍历列表
    # w in goods    w in good    w in going    w in gone
    print('good' in w)      # True    True    False    False
    print('----->', i)
    i += 1

10、删除与漏删

words = ['hello', 'good', 'google', 'world', 'alphago']

w = input('请输入一个单词:')   # 输入go

i = 0   # i表示下标从0开始
l = len(words)

while i < l:
    if w in words[i]:
        del words[i]

        l -= 1

    i += 1

print(words)    # 漏删了google

改善后

words = ['hello', 'good', 'google', 'world', 'alphago']

w = input('请输入一个单词:')   # 输入go

i = 0   # i表示下标,从0开始
l = len(words)

while i < l:
    if w in words[i]:
        del words[i]

        l -= 1
        continue    # 增加continue语句,如果执行了if语句,则跳过当前循环,即跳过语句i += 1,就不会再出现漏删问题

        # 或者i -= 1,但不推荐


    i += 1

print(words)

 

11、列表的切片操作

'''
列表的切片
'''

list1 = ['童瑶', '江疏影', '毛晓彤', '杨玏', '李泽锋', '杨立新', '马志威']
str = '童瑶 江疏影 毛晓彤 杨玏 李泽锋 杨立新'
print(list1)

print(list1[0])

# 列表也支持切片
# 正向取值,从左向右,小数在前,大数在后

print(list1[ : 3])      # 切片后将截取的结果再次保存在一个列表中
print(str.split(' '))   # 列表不支持split()分割,字符串才能支持split()分割,分割后将内容存放到列表中

print(list1[-3 : -1])

# 步长为2
print(list1[ : : 2])

print(list1[-5 : -1 : 2])   # 不包含-1,但是如果想取-1该如何写?  简单,[-5 : : 2]即可

# 反向取值,从右向左,大数在前,小数在后
print(list1[-1 : -8 : -2])  # 注意此处的-8,列表中的下标只有-1 ~ -7

print(list1[-1 : : -2])

 

12、列表的添加

'''
list列表的添加
'''

girls = ['girls']

# 列表的函数使用:append()    extend()    insert()

# append()  末尾追加

while True:
    name = input('请输入你心目中美女的名字:')
    if name == 'quit':
        break

    girls.append(name)

print(girls)

# extend()  一次添加多个元素,类似列表的合并,可用+号替代

# extend()函数输入的字符串会被分割成多个字符,如输入“童瑶”会被存入列表[,]
names = ['孙红雷', '马冬梅', '刘德华', '古天乐']

print(names)

name = input('请输入你心目中的美女名字:')
girls.extend(names)     # names列表中的内容合并到girls列表中

# 也可以用+号合并列表

girls += names

print(girls)

# insert()  指定下标插入,被插入元素的下标后移一位

girls.insert(1, '童瑶')

print(girls)

 

小案例:产生10个随机数,保存到列表中

'''
小案例:产生10个随机数,将其保存到列表中
    1、产生10个随机数
    2、将产生的随机数存放到列表中
    3、打印列表
'''

import random

random_list = []

for i in range(10):
    rand = random.randint(1, 50)

    random_list.append(rand)    # 将随机数追加到列表random_list

print(random_list)

 

小案例:产生10个随机数,将不同的10个数保存到列表中

'''
小案例:产生10个随机数,将其不同的数保存到列表中
    1、产生10个随机数
    2、判断列表中是否有相同的数,如果没有则保存到列表中
    3、打印列表
'''

import random

random_list = []

i = 0

while i < 10:
    rand = random.randint(1, 50)

    if rand not in random_list:
        random_list.append(rand)
        i += 1

print(random_list)

 

Python列表推导式

列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。

它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是 0 个或多个 for 或者 if 语句。

那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以 if 和 for 语句为上下文的表达式运行完成之后产生。

列表推导式的执行顺序:

各语句之间是嵌套关系,左边第二个语句是最外层,依次往右进一层,左边第一条语句是最后一层。

[x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]

他的执行顺序是:

list_b = []

for x in range(1,5):

    if x > 2:

        for y in range(1,4):

            if y < 3:

                list_b.append(x*y)

结果是:[3, 6, 4, 8]

 

'''
Python列表推导式(list comprehension)
    列表推导式是指使用循环来创建列表
    列表推导式是Python构建列表的一种快捷方式,可以使用简洁的代码创建一个列表。
    列表推导式是通过一个可迭代对象来生成列表的,range()可以说是列表推导式中最常用的可迭代对象了。
    对列表推导式来说,range()可以提高列表推导式的可读性和间接性。
'''

# 列表推导式
list_a = [x * y for x in range(1, 5) if x > 2 for y in range(1, 4) if y < 3]
print(list_a)
# 它的执行顺序是:
list_b = []
for x in range(1, 5):
    if x > 2:
        for y in range(1, 4):
            if y < 3:
                list_b.append(x * y)
print(list_b)

# for循环创建列表
list1 = list()      # 创建空列表
for i in range(5):
    list1.append(i)
print(list1)

# 列表推导式创建列表
list2 = [b for b in range(5)]
print(list2)

### 复杂一点的列表推导式
# in后面跟随其他可迭代对象,如字符串
list3 = [5 * c for c in 'python']
print(list3)

# if条件语句的列表推导式
list4 = [d for d in range(6) if d % 2 != 0]
print(list4)

# 多个for循环的列表推导式
list5 = [(e, f * f) for e in range(3) for f in range(5, 15, 5)]
print(list5)
# 等价于
list_e = []      # 创建空列表
for e in range(3):
    for f in range(5, 15, 5):       # f = 5, 10
        list_e.append((e, f * f))
print(list_e)

# 嵌套列表推导式,多个并列条件
list6 = [[x for x in range(g - 3, g)] for g in range(12) if g % 3 == 0 and g != 0]
print(list6)
# 等价于
list_f = list()      # 创建空列表
for g in range(12):
    if g % 3 == 0 and g != 0:       # g = 369
        y = []
        for x in range(g - 3, g):   # range(0, 3)  range(3, 6)  range(6, 9)
            y.append(x)

        list_f.append(y)
print(list_f)

 

'''字典推导式'''
# 因为key是唯一的,所以最后value都是1
dict_a = {key: value for key in 'python' for value in range(4)}
print(dict_a)
# {'p': 3, 'y': 3, 't': 3, 'h': 3, 'o': 3, 'n': 3}

# 可以根据键来构造值
dict_b = {key: key * key for key in range(6)}
print(dict_b)
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 遍历一个有键值关系的可迭代对象
list_phone = [('HUAWEI', '华为'), ('MI', '小米'), ('OPPO', 'OPPO'), ('VIVO', 'VIVO')]
dict_c = {key: value for key, value in list_phone}
print(dict_c)
# {'HUAWEI': '华为', 'MI': '小米', 'OPPO': 'OPPO', 'VIVO': 'VIVO'}

dict_d = {key: value for key, value in enumerate(list_phone)}
print(dict_d)
# {0: ('HUAWEI', '华为'), 1: ('MI', '小米'), 2: ('OPPO', 'OPPO'), 3: ('VIVO', 'VIVO')}

 

'''集合推导式'''
# 集合是无序且重复的,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样
set_a = {value for value in '有人风轻云淡,有人负重前行。'}
print(set_a)
# {'', '', '', '', '', '', '', '', '', '', '', ''}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。