Python 列表

导读:本篇文章讲解 Python 列表,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

列表

列表的创建

1. 列表字面量

arr = [0, 1, 2, 3, 4, 5, 6]
print(type(arr))

打印结果:

<class ‘list’>

2. 列表表达式

列表表达式的语法为:
[ 表达式 for 迭代变量 in 可迭代对象 if 条件表达式 ]

无判断型
arr = [i for i in range(0, 36, 3)]
print(arr)
print(type(arr))

打印结果:

[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]
<class ‘list’>

判断型
arr = [i * i for i in range(6) if i*i <= 9 ]
print(arr)

打印结果:

[0, 1, 4, 9]

3. 通过内置函数 list()

Python 内置函数可将其他类型的可迭代对象转换为列表对象。list() 函数并不强迫使用者向它传递参数,当 list() 函数未接受到参数时将返回一个空列表。

不是所有的可迭代对象都可以被 list() 函数转换为列表对象。
class RangeLike():
    def __init__(self, start, end, stop):
        self.start = start
        self.end = end
        self.stop = stop
    def __iter__(self):
        return self
    
creater = RangeLike(0, 36, 3)
print(list(creater))

抛出错误:

TypeError: iter() returned non-iterator of type ‘RangeLike’

注:

  1. 自建对象中若实现了 __iter__ 方法则该对象为可迭代对象。
  2. 若一个可迭代对象不为 Python 内置可迭代对象(如 range 对象),迭代器对象或生成器对象,一般都无法通过 list() 函数转换为列表对象或是使用 for 循环操作。
将字符串转换为列表对象
string = 'RedHeart'
print(list(string))

打印结果:

[‘R’, ‘e’, ‘d’, ‘H’, ‘e’, ‘a’, ‘r’, ‘t’]

将字典转换为列表对象
tool = {'BP':'BurpSuite', 'NMap':'NetworkMapper', 
'MSF':'MetasploitFramework'}
print(list(tool))

打印结果:

[‘BP’, ‘NMap’, ‘MSF’]

将字典转换为列表对象默认是将字典的各个键组合成列表,相当于

tool = {'BP':'BurpSuite', 'NMap':'NetworkMapper', 
'MSF':'MetasploitFramework'}
print(tool.keys())
print(list(tool.keys()))

# 若想将字典的各个键对应的值组合成列表,则可以
print(list(tool.values()))

打印结果:

dict_keys([‘BP’, ‘NMap’, ‘MSF’])
[‘BP’, ‘NMap’, ‘MSF’]
[‘BurpSuite’, ‘NetworkMapper’, ‘MetasploitFramework’]

索引

列表是由许多元素组成的有序序列,通过索引标识元素的位置,索引从 0 开始,这是指第一个元素的索引是 0 而不是 1。索引也可以是负数,像索引 -1 对应的就是有序序列的最后一个值。

切片

在 Python 中,形如 [start_index : end_index] (仅为基本结构,切片表达式还有许多变体)的结构称为切片,切片可以将有序序列中的部分元素取出并重组为一个新的有序序列(其实并不是新的有序序列,可以理解为原有序序列的视图)。
切片由中括号,开始索引,冒号,结束索引组成,切片将返回一个开始索引到结束索引间的所有元素组成的有序序列(元素包含开始索引对应的元素但不包含结束索引对应的元素)。

arr = [i for i in range(0, 36, 3)]
print(arr)  # [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]

print(arr[3:6])  # [9, 12, 15]
print(arr[:6])  # [0, 3, 6, 9, 12, 15, 18, 21]
print(arr[8:])  # [24, 27, 30, 33]
print(arr[:])  # [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]
print(arr[-4:])  # [24, 27, 30, 33]
print(arr[-3:-1])  # [27, 30]
print(arr[::-1])  # [33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0]
print(arr[::2]) # [0, 6, 12, 18, 24, 30]
print(arr[::-2])  # [33, 27, 21, 15, 9, 3]

注:

  1. 开始索引的默认值为 0,而结束索引的默认值为有序序列最后一个元素对应的 索引值+1 后对应的结果。
  2. 当开始索引或结束索引为负数时,索引对应的值可以理解为个数,比如 -4 即倒数第四个,这样可以帮助我们更快的判断。
  3. 切片的变体 [start_index : end_index : step] 对于其中的 step 可以理解为步长,步长即组成的新有序序列中各相邻元素在原有序序列中索引的差值。

浅拷贝(视图)与深拷贝(本体)

浅拷贝拷贝的是对象的指针(对象存放的内存地址),深拷贝拷贝的是对象本身。

切片是深拷贝

过程:

  1. 创建列表arr
  2. 将列表arr的切片arr[3:6]赋值给arr1
  3. 修改切片中的内容
  4. 通过打印发现切片内容发生更改,而原列表内容未发生更改
arr = [i for i in range(0, 36, 3)]
print(arr)  # [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]

arr1 = arr[3:6]
print(arr1)  # [9, 12, 15]
arr1[0] = 99999
print(arr)  # [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]
print(arr1)  # [99999, 12, 15]

结论:
切片是深拷贝,在切片上做的任何操作都不会在原列表中反映出来。

列表的赋值操作是浅拷贝

过程:

  1. 创建列表arr
  2. 将arr赋值给arr1
  3. 改变arr1中的内容
  4. 通过打印列表arr以及arr1发现arr中的内容也发生了改变
arr = [i for i in range(0, 36, 3)]
print(arr)  # [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]

arr1 = arr
arr1[0] = 99999
print(arr)  # [99999, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]
print(arr1)  # [99999, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]

结论:
列表的赋值操作是浅拷贝,赋值操作中的数方中的一方发生改变将在其他几方中反映出来。

列表的常见操作

1. 合并列表

arr = [i for i in range(0, 19, 3)]
arr1 = [j for j in range(21, 36, 3)]
print(arr)  # [0, 3, 6, 9, 12, 15, 18]
print(arr1)  # [21, 24, 27, 30, 33]
print(arr + arr1)  # [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]

2. 列表的重复拼接

arr = [1, 0]
print(arr * 3)  # [1, 0, 1, 0, 1, 0]

3. in 操作

该操作可以判断目标元素是否存在于被检测的列表中。

arr = [i for i in range(0, 36, 3)]
print(3 in arr)  # True
print(999 in arr)  # False

4. 遍历

arr = [i for i in range(7)]

for i in arr:
    print(i)

打印结果:

0
1
2
3
4
5
6

5. 删除指定位置的元素

arr = [i for i in range(0, 36, 3)]
print(arr)  # [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]

del arr[1]
print(arr)  # [0, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]

嵌套列表

在一个列表中可以嵌套其他列表。

arr = [i for i in range(0, 20, 3)]
arr1 = [j for j in range(21, 36, 3)]

arr.append(arr1)  # append 方法可以在列表的尾部添加一个对象
print(arr)  # [0, 3, 6, 9, 12, 15, 18, [21, 24, 27, 30, 33]]
print(arr[-1])  # [21, 24, 27, 30, 33]
print(arr[-1][0])  # 21

有关列表的常用函数及方法汇总

函数

函数 内容
len() 该函数将返回指定列表中元素的个数
max() 该函数将返回指定列表中最大的那个元素
min() 该函数将返回指定列表中最小的那个元素
list() 将部分可迭代对象转换为列表对象

方法

方法 内容
.count() 返回指定对象(参数)在列表对象中出现的次数
.append() 向列表的尾部中添加指定对象
.remove() 循环遍历列表,将在列表中遇到的第一个与指定参数相同的对象删除,若列表中无此对象,将抛出 ValueError 错误。
.insert() 该方法有两个参数,第一个参数是将指定对象存放在列表中的索引位置,第二个参数即指定对象。
.pop() 该方法默认将列表的最后一位元素删除并返回删去的元素,可以通过添加一个参数指定索引,以删除指定位置的元素
.reverse() 该方法将把列表反转
.copy() 返回一个列表对象的深拷贝
.clear() 将列表中的所有元素清楚
.index() 循环遍历列表,返回第一个与指定参数匹配的元素的索引
.extend() 将指定的序列对象内的元素添加到列表的尾部
list.sort(cmp=None, key=None, reverse=False) 对列表对象内的元素进行排序

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84056.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!