Python 列表 | 元组 | 字典 | 集合
列表
列表的创建
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’
注:
- 自建对象中若实现了 __iter__ 方法则该对象为可迭代对象。
- 若一个可迭代对象不为 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]
注:
- 开始索引的默认值为 0,而结束索引的默认值为有序序列最后一个元素对应的 索引值+1 后对应的结果。
- 当开始索引或结束索引为负数时,索引对应的值可以理解为个数,比如 -4 即倒数第四个,这样可以帮助我们更快的判断。
- 切片的变体 [start_index : end_index : step] 对于其中的 step 可以理解为步长,步长即组成的新有序序列中各相邻元素在原有序序列中索引的差值。
浅拷贝(视图)与深拷贝(本体)
浅拷贝拷贝的是对象的指针(对象存放的内存地址),深拷贝拷贝的是对象本身。
切片是深拷贝
过程:
- 创建列表arr
- 将列表arr的切片arr[3:6]赋值给arr1
- 修改切片中的内容
- 通过打印发现切片内容发生更改,而原列表内容未发生更改
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]
结论:
切片是深拷贝,在切片上做的任何操作都不会在原列表中反映出来。
列表的赋值操作是浅拷贝
过程:
- 创建列表arr
- 将arr赋值给arr1
- 改变arr1中的内容
- 通过打印列表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