1.列表数据类型
"列表" 是一个值,它包含多个字构成的序列。"列表值"指的是列表本身,他作为一个值可以保存在变量中,可以传递给函数,像所有其他值一样,而不是指列表值内那些值
列表用左方括号开始,右方括号结束[]
[1,2,3,4,5]
2.用列表下标取列表中的单个值
spam = ['cat','bat','rat']
print(spam[1])
下标只能是整数,不能是浮点数
负数下标
spam = ['cat','bat','rat']
print(spam[-3])
- cat
3.利用切片取子列表
spam = ['cat','bat','rat','dog']
print(spam[1,3])
- ['bat', 'rat']
spam = ['cat','bat','rat','dog']
print(spam[:])
- ['cat', 'bat', 'rat', 'dog']
4.len()函数获取列表的长度
spam = ['cat','bat','rat','dog']
print(len(spam))
- 4
5.用下标改变列表的值
spam = ['cat','bat','rat','dog','elephant']
spam[3] = '哈哈'
spam[-1] = spam[0]
print(spam)
- ['cat', 'bat', 'rat', '哈哈', 'cat']
6.列表连接和列表复制
+号操作符可以连接两个列表,得到一个新列表,就像两个字符串拼接一样;*号操作符可以用于一个列表和一个整数,实现列表的复制。
spam = ['cat','bat','rat','dog','elephant']
spam1 =spam + ['1','2','3']
spam2 =spam * 3
print(spam1)
print(spam2)
7.用del语句删除列表中的值
del 语句将删除列表中下标处的值,表中被删除值后面的所有值,都将向前移动一个下标。例如,在交互式环境中输入以下代码
spam = ['cat','bat','rat','dog','elephant']
del spam[2]
print(spam)
del 语句也可用于一个简单变量,删除它,作用就像是“取消赋值”语句。如果在删除之后试图使用该变量,就会遇到 NameError 错误,因为该变量已不再存在。
8.使用列表
8.1 列表用于循环
for i in spam2:
print(i)
一个常见的 Python 技巧,是在 for 循环中使用 range(len(someList)),迭代列表的每一个下标
for i in range(len(spam)):
print(i)
print('Index' + str(i) + 'in spam is ' + spam[i])
8.2 in和not in 操作符
'howdy' in ['hello', 'hi', 'howdy', 'heyas'] and 'jjjj' not in spam
8.3 多重赋值技巧
可以用列表的值一次给多个变量赋值
cat = ['fat', 'black', 'loud']
size, color, disposition = cat
print(size)
- 这里变量个数必须要和列表中的长度相等,不然会报错 ValueError
8.4 增强的复制操作
spam += 1 spam = spam + 1
spam -= 1 spam = spam - 1
spam *= 1 spam = spam * 1
spam /= 1 spam = spam / 1
spam %= 1 spam = spam % 1
9.方法
方法和函数其实是一回事,只不过它是在一个值上调用。每种数据类型都有它自己的一组方法,列表的数据类型有自己的一些方法,用来实现增,删,改,查。
9.1用Index方法在列表中查找值
cat = ['fat', 'black', 'loud']
print(cat.index('fat'))
- 0
9.2 用append()和insert()方法增加列表的值
append()方法调用,将参数添加到列表末尾。insert()方法可以在列表任意下标处插入一个值。insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值
cat = ['fat', 'black', 'loud']
print(cat.index('fat'))
cat.append('red')
print(cat)
cat.insert(0,'嗯嗯')
print(cat)
- ['fat', 'black', 'loud', 'red']
- ['嗯嗯', 'fat', 'black', 'loud', 'red']
9.2 用remove(),pop()方法删除列表中的值
如果知道想要删除的值在列表中的下标,del 语句就很好用。如果知道想要从列表中删除的值,remove()方法就很好用。
cat = ['fat', 'black', 'loud']
del cat[1]
print(cat)
cat.remove('loud')
print(cat)
- ['fat', 'loud']
- ['fat']
pop()方法:
spam = ['a', 'z', 'A', 'Z']
spam.pop(0)
print(spam)
使用场景和示例:
- remove适用于删除列表中第一次出现的特定值。
- pop适用于需要删除指定索引处的元素,并获取该元素的值。
- del适用于根据索引直接删除元素,不返回任何值。
9.2 用sort()方法将列表中的值排序
cat = ['-9', '7', '3','1']
cat.sort()
print(cat)
cat.sort(reverse = True)
print(cat)
- ['-9', '1', '3', '7']
- ['7', '3', '1', '-9']
如果需要按照普通的字典顺序来排序,就在 sort()方法调用时,将关键字参数key 设置为 str.lower
spam = ['a', 'z', 'A', 'Z']
spam.sort(key=str.lower)
spam
Python 中缩进规则的例外
import random
messages = ['It is certain',
'It is decidedly so',
'Yes definitely',
'Reply hazy try again',
'Ask again later',
'Concentrate and ask again',
'My reply is no',
'Outlook not so good',
'Very doubtful']
print(messages[random.randint(0, len(messages) - 1)])
也可以在末行使用\将一条指令写成多行
print('你就是和和哈打算阿达代发收到\
dshaffasd ')
10.类似列表的类型:字符串和元组
列表并不是唯一表示序列值的数据类型,字符串和列表其实很相似,只要你认为字符串是单个文本字符的列表。对列表的许多操作也可用于字符串:按下标取值,切片,for循环,len()等等
name = 'lizhidong'
print(name[1])
for i in name:
print("* * * " + i + "* * * ")
列表和字符串最重要的不同的一点就是 列表是可变的数据类型 可以对它的值进行删除和增加,字符串不行
元组数据类型
除了元组使用()来定义和元组是不可变的,几乎和列表的数据类型是一样的
eggs = ('hello', 42, 0.5)
eggs[1]
egg = ('ddd',)
egg
11.用list()和tuple()函数来转换类型
eggs = ('hello', 42, 0.5)
print(list[eggs])
geegs = ['www',3,4,5]
tuple(geegs)
如果一个元组需要可变版本,那转化成list就很方便
12.引用
变量赋值
spam = 43
cheese = spam
spam = 100
print(cheese)
print(spam)
- 43
- 100
列表赋值:只是将它的引用赋给下一个变量,列表本身从未被复制,所以当增加spam列表元素时,实际上也给sheese指向的列表增加了列表值
spam = [1,2,3,4,5,6]
cheese = spam
spam.append('hhh')
print(cheese)
print(spam)
- [1, 2, 3, 4, 5, 6, 'hhh']
- [1, 2, 3, 4, 5, 6, 'hhh']
变量包含对列表值的引用,而不是列表值本身。但对于字符串和整数值,变量就包含了字符串或整数值。在变量必须保存可变数据类型的值时,例如列表或字典,Python 就使用引用。对于不可变的数据类型的值,例如字符串、整型或元组,Python变量就保存值本身。
13引用传递
def eggs(someParameter):
someParameter.append('Hello')
spam = [1, 2, 3]
eggs(spam)
print(spam)
- [1, 2, 3, 'Hello']
当函数被调用时 参数的值就会被复制给变元 尽管 spam 和 someParameter 包含了不同的引用,但它们都指向相同的列表。这就是为什么函数内的 append('Hello')方法调用在函数调用返回后,仍然会对该列表产生影响。
14copy模块中的copy()和deecopy()函数
在处理字典和列表时,尽管传递引用很方便,但如果函数修改了原来的字典或者列表的值,就不太好了,python中提供了copy模块 用copy.copy()可以复制列表或者字典的值,而不只是引用
import copy
spam = [1,2,3,4,5,67]
cheese = copy.copy(spam)
spam[1] = 'hello'
print(spam)
print(cheese)
- [1, 'hello', 3, 4, 5, 67]
- [1, 2, 3, 4, 5, 67]
如果复制列表中包含列表的列表 用deecopy函数
15.练习
1. 什么是[]?
空的列表值,它是一个列表,不包含任何列表项。这类似于''是空的字符串值
2. 如何将'hello'赋给列表的第三个值,而列表保存在名为 spam 的变量中?(假定变量包含[2, 4, 6, 8, 10])。
spam = [2, 4, 6, 8, 10]
spam.insert(2,'hello')
* 对接下来的 3 个问题,假定 spam 包含列表['a', 'b', 'c', 'd']。
3. spam[int('3' * 2) / 11]求值为多少?
应该是
spam = ['a', 'b', 'c', 'd']
spam[int(int('3' * 2) / 11)]
'd'
4. spam[-1]求值为多少?
d
5. spam[:2]求值为多少?
['a', 'b']
* 对接下来的 3 个问题。假定 bacon 包含列表[3.14, 'cat', 11, 'cat', True]。
6. bacon.index('cat')求值为多少?
1
7. bacon.append(99)让 bacon 中的列表值变成什么样?
[3.14, 'cat', 11, 'cat', True,99]
8. bacon.remove('cat')让 bacon 中的列表时变成什么样?
[3.14, 11, 'cat', True]
9. 列表连接和复制的操作符是什么?
+ *
10. append()和 insert()列表方法之间的区别是什么?
append()追加到列表最后 insert() 可以指定新增位置
11. 从列表中删除值有哪两种方法?
remove() del pop()
12. 请说出列表值和字符串的几点相似之处。
字符串就像单个字符序列的列表,都可以for循环取值
13. 列表和元组之间的区别是什么?
可变 不可变
14. 如果元组中只有一个整数值 42,如何输入该元组?
(42,)
15. 如何从列表值得到元组形式?如何从元组值得到列表形式?
list() tuple()
16. “包含”列表的变量,实际上并未真地直接包含列表。它们包含的是什么?
引用 实际上只是个地址
17. copy.copy()和 copy.deepcopy()之间的区别是什么?
copy.deecopy()复制包含列表的列表
16逗号项目
假定有下面这样的列表:
- spam = ['apples', 'bananas', 'tofu', 'cats']
编写一个函数,它以一个列表值作为参数,返回一个字符串。该字符串包含所有表项,表项之间以逗号和空格分隔,并在最后一个表项之前插入 and。例如,将前面的 spam 列表传递给函数,将返回'apples, bananas, tofu, and cats'。但你的函数应该能够处理传递给它的任何列表。
###
需求:
一个函数
参数是一个列表
函数返回一个字符串
该字符串包含所有列表项 并且用,分割 在最后一个表项前加上and
###
def list_to_str(list_in):
_str = ''
for i in range(len(list_in)-1):
_str = _str + list_in[i] + ','
_str = _str + 'and' + list_in[-1]
_str = _str + '。'
return _str
spam = ['apples', 'bananas', 'tofu', 'cats']
print(list_to_str(spam))
下面这段代码是由AI改写的,它实现了与上述需求相同的功能:非常好的代码!
def list_to_str(list_in):
if len(list_in) == 0:
return ''
elif len(list_in) == 1:
return list_in[0] + '。'
else:
_str = ', '.join(list_in[:-1]) + ' and ' + list_in[-1] + '。'
return _str
spam = ['apples', 'bananas', 'tofu', 'cats']
print(list_to_str(spam))
其中join方法是 Python 中字符串的一个方法,用于将一个可迭代对象(如列表、元组等)中的元素连接成一个字符串 基本语法
separator.join(iterable)
17.字符图网格
假定有一个列表的列表,内层列表的每个值都是包含一个字符的字符串,像这样:
grid = [['.', '.', '.', '.', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['O', 'O', 'O', 'O', 'O', '.'],
['.', 'O', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['.', '.', '.', '.', '.', '.']]
打印出:
..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....
for j in range(len(grid[0])):
for i in range(len(grid)):
print(grid[i][j], end='')
print()
琢磨半天只能这样写了虽然结果一样 但感觉这样写的不对,这个应该是二维列表行转列就能简单的实现了 不用这样写
查了一下
列表推导式 值得了解一下
[expression for item in iterable if condition]
- expression 是当前项的处理逻辑,它定义了新列表中的每个元素。
- item 是从 iterable 中取出的每个元素。
- *iterable 是一个可以遍历的对象,比如列表、元组、字典、集合或字符串。
- condition 是一个可选项,它是一个逻辑表达式,用于过滤不符合条件的项。**
# 定义一个二维列表
grid = [['.', '.', '.', '.', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['O', 'O', 'O', 'O', 'O', '.'],
['.', 'O', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['.', '.', '.', '.', '.', '.']]
# 使用嵌套列表推导式进行转置
transposed = [[row[i] for row in grid] for i in range(len(grid[0]))]
print(transposed)
# 把列表项连接转换成字符串
for row in transposed:
str1 = ''.join(row)
print(str1)
这个更牛逼一点。哈哈