python 列表

列表

当我们有多个数据需要保存的时候,可以考虑使用列表。列表是有序的,用户可以通过下标的方式对列表进行切片,还可以使用下标来修改列表的元素。

1.列表的表示方式

names = ["tank","tom","frank","jerry","honey"]
    
# 使用list传入一个可迭代对象进行转换
>>> words = list(("a","b",'c'))
>>> print(words)
['a', 'b', 'c']

2.列表的操作

2.1 增加元素

append # 在列表的最后面追加数据

insert # 在索引之前加入一个对象

extend # 把另外一个可迭代对象融合到一起

#列表的最后添加一个元素
>>> names = ["tank","tom","frank","jerry","honey"]
>>> names.append("jj")
>>> names
['tank', 'tom', 'frank', 'jerry', 'honey', 'jj']

# 在索引2的位置添加xinlin
# insert(index,object)
>>> names.insert(2,"xinlin")
>>> names
['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj']

# 拼接一个可迭代对象,后面是传入一个可迭代对象。
>>> words
['b', 'c', 'z', 'a']
>>> names.extend(words)
>>> names
['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z', 'a']

2.2 删除元素

pop # 默认删除列表最后一个数据,并返回。根据下标取出元素。

remove # 删除指定的元素,如果有重复的元素会先删除索引较小的,删除元素不存在会报错。

clear # 清空列表

del # 也可以删除指定元素

# pop 方法
>>> names
['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z', 'a']
>>>
>>> names.pop()
'a'
>>> names
['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
>>> names.pop(0)
'tank'
>>> names
['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']

# remove
>>> names = ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
>>> names.remove("jj")
>>> names
['tom', 'xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']

# del 删除指定元素
>>> names
['tom', 'xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']
>>>
>>> del [names[0]]
>>> names
['xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']

# 清空列表
>>> names.clear()
>>> names
[]

2.3 修改元素

使用下标直接修改。

>>> names = ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
>>> names[0] = 'zeop'
>>> names
['zeop', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']

2.4 查询元素

index     # 查看元素的索引,如果没有该元素会报错。
count     # 查看元素出现的次数。
in        # 查看元素是否在列表中。
# 返回元素的索引
>>> names
['zeop', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
>>> names.index('xinlin')
1

# 查看元素出现的次数
>>> names = ['zeop', 'xinlin', 'frank', 'jerry', 'honey','a','a','a']
>>> names.count('a')
3

# 查看元素是否在可迭代对象中,返回布尔值
>>> names = ['zeop', 'xinlin', 'frank', 'jerry', 'honey','a','a','a']
>>> "frank" in names
True

3.列表的遍历

2.1 while遍历

# while 遍历
names = ["frank",'tom','jerry','pink panther','spike']
tag = 0
while tag < len(names):
    print(names[tag])
    tag +=1

2.2 for 遍历

names = ["frank",'tom','jerry','pink panther','spike']
for i in names:
    print(i)

4.变量的替换

# 中间量替换
a = 20
b = 10

c = b
b = a
a = c
print("a:",a,"\nb:",b)

# 逻辑运算,只限于数字
a = 10
b = 20

a = a + b
b = a - b
a = a - b
print("a:",a,"\nb:",b)

# python 特有的
a = 10
b = 20
a, b = b, a
print("a:",a,"\nb:",b)

5.列表的排序

>>> num = [1,4,5,2,3,7,9]
>>> num.sort()
>>> num
[1, 2, 3, 4, 5, 7, 9]

# 反转排序
>>> num.sort(reverse=True)
>>> num
[9, 7, 5, 4, 3, 2, 1]

# 内置函数sorted,不会改变列表值,会生成一个新的列表。
>>> num = [1,4,5,2,3,7,9]
>>> sorted(num)
[1, 2, 3, 4, 5, 7, 9]
>>> x = sorted(num)
>>> x
[1, 2, 3, 4, 5, 7, 9]
>>> num
[1, 4, 5, 2, 3, 7, 9]

6.列表元素反转

# 1、通过切片的方式
>>> names = ["tank","tom","frank","jerry","honey"]
>>> names[::-1]
['honey', 'jerry', 'frank', 'tom', 'tank']

# 直接反转列表会更改列表内容
>>> names
['tank', 'tom', 'frank', 'jerry', 'honey']
>>> names.reverse()
>>> names
['honey', 'jerry', 'frank', 'tom', 'tank']

7.可变类型与不可变类型

python中的数据都是保存在内存里面的。数据类型可以分为两类:

可变数据类型 : 列表、字典、集合

不可变数据类型:字符、数字、元组

可以使用id()函数查看内存地址。

不可变数据类型,如果修改内存地址火发生变化。

可变数据类型不会发生变化。

不可变数据类型

# 不可变数据类型
a = 12
b = a
print(a,b)
print("修改前:a的内存地址: %X,b的内存地址: %X" % (id(a), id(b)))
a = 24
print("修改后:a的内存地址: %X,b的内存地址: %X" % (id(a), id(b)))
print(a,b)

12 12
修改前:a的内存地址: 7FFC415CA300,b的内存地址: 7FFC415CA300
修改后:a的内存地址: 7FFC415CA480,b的内存地址: 7FFC415CA300
24 12

原理图解

修改前

修改后

可变数据类型

names = ["tom","squire","zep"]
c = names
print(names,c)
print("修改前内存地址:names: %X ,c: %X" % (id(names), id(c)))

names[0] = 'kindon'
print("修改后内存地址:names: %X ,c: %X" % (id(names), id(c)))
print(names,c)

['tom', 'squire', 'zep'] ['tom', 'squire', 'zep']
修改前内存地址:names: 1E268BF5188 ,c: 1E268BF5188
修改后内存地址:names: 1E268BF5188 ,c: 1E268BF5188
['kindon', 'squire', 'zep'] ['kindon', 'squire', 'zep']

原理图解

修改后,还是指向同一内存地址所以c的值也会改变。

8.列表的复制

浅复制

# 这样复制列表会有一个问题就是names 和x的内存地址空间都是指向同一地址空间,这样地址空间中存储的数据发生了变化变量names和x都会变。
names = ["tom", "jerry", "spaik", "john"]
x = names

names[0]= '张三'
print(names,x)

方法一

# 这样新的变量生成了新的地址空间,就不会互相影响。
names = ["tom", "jerry", "spaik", "john"]
x = names.copy()

names[0] = '张三'
print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
print(names,x)

方法2

import copy

names = ["tom", "jerry", "spaik", "john"]
x = copy.copy(names)
names[0] = '张三'
print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
print(names,x)

方法3

names = ["tom", "jerry", "spaik", "john"]
x = names[::]
names[1] = "老五"

print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
print(names,x)

深复制

浅复制默认只复制一层,深复制必须使用copy模块,

# 浅复制,对于这种嵌套列表,里面的列表还是指向同一内存地址;所以在改变了嵌套列表中的值之后还是影响了浅复制的变量。
import copy

words = ['linsan', "juice",[1,2,3] ,"john", "linlin"]

words1 = words.copy()
words[2][0] = 1000
print(words1)
['linsan', 'juice', [1000, 2, 3], 'john', 'linlin']
# 深复制
import copy

words = ['linsan', "juice",[1,2,3] ,"john", "linlin"]

words1 = words.copy()
words2 = copy.deepcopy(words)

words[2][0] = 1000
print(words1)
print(words2)

# ------深复制的结果------
['linsan', 'juice', [1000, 2, 3], 'john', 'linlin']
['linsan', 'juice', [1, 2, 3], 'john', 'linlin']

pythontutor.com

9.列表的嵌套

把十个老师随机分到三个办公室中。

import random

teachers = ["A", "B", "C", "D", "E", "F", 'G', "H"]
zoons = [[], [], []]

for i in teachers:
    zoons[random.randint(0,2)].append(i)
print(zoons)

# 使用for的方式
for i in teachers:
    zoom = random.choice(zoons)
    zoom.append(i)
print(zoons)


# 把每个办公室的老师列出来
for i in teachers:
    zoom = random.choice(zoons)
    zoom.append(i)

# 一般要引用下標的使用while
# for也可以使用下標
for i ,zoom in enumerate(zoons):
    print("辦公室%d ,有老師:" % i, end=" ")
    for z in zoons[i]:
        print(z, end=" ")
    print()

10.列表推导式

一般只用于生成简单的列表

# 最简答的列表推导式
points = [i for i in range(10)]
print(points)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 含有条件的列表推导
points2 = [x for x in range(10) if x % 2 == 0]
print(points2)

[0, 2, 4, 6, 8]

# 含有两个参数的推导式
points3 = [(y, z) for y in range(2) for z in range(3)]
print(points3)

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

11.练习

找出列表中最大的数。

nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]
"""
假設第一個數字為最小的一個數用它去和其它的數進行比較,如果比它大就把它從新
賦值,如果比它小就忽略。
"""
x = nums[0]
for i in nums:
    if x < i:
        x  = i
print(x)

找出列表中最大的数并找到下标。

# 方法一
nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]

x = nums[0]
for i in nums:
    if x < i:
        x  = i
print('列表中最大的數%d,下標是:%d' % (x, nums.index(x)))

# 方法二
nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]

i = 0
num = nums[0]
while i < len(nums):
    if num < nums[i]:
        num = nums[i]
        index = i
    i +=1
print('列表中最大的數是:%d,索引是%d' % (num, index))

删除列表中的空字符串

# 會有bug
words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
for i in words:
    if i == "":
        words.remove(i)
print(words)

['zhangsna', 'ahahha', 'joker', 'wa', 'ji', '']
# 非空字符串进行新的赋值
new_words = []
words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
for i in words:
    if i != "":
        new_words.append(i)
words = new_words
print(words)

['zhangsna', 'ahahha', 'joker', 'wa', 'ji']
words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
i = 0
while i < len(words):
    if not words[i]:
        words.remove(words[i])
        i -=1
    i +=1
print(words)

['zhangsna', 'ahahha', 'joker', 'wa', 'ji']

把列表1-100的数字转换为三个一组的嵌套列表。比如[1,2,3,4,5,6,......,100]变为[[1,2,3],[4,5,6],[7,8,9],...]

# 把列表1-100的数字转换为三个一组的嵌套列表。比如[1,2,3,4,5,6,......,100]变为[[1,2,3],[4,5,6],[7,8,9],...]
m = [i for i in range(1,101)]

points = [m[x:x+3] for x in range(0,101,3)]
print(points)
posted @ 2022-06-12 11:34  Gshelldon  阅读(59)  评论(0编辑  收藏  举报