Python列表

244 阅读7分钟

1.列表数据类型

“列表”是一个值,它包含多个字构成的序列。术语“列表值”指的是列表本身(它作为一个值,可以保存在变量中,或传递给函数,像所有其他值一样),而不是指列表值之内的那些值。列表值看起来像这样:['cat', 'bat', 'rat', 'elephant']。就像字符串值用引号来标记字符串的起止一样,列表用左方括号开始,右方括号结束, 即[]。列表中的值也称为“表项”。表项用逗号分隔(就是说,它们是“逗号分隔的”)

1.1用下标获取列表的单个值

list1 = [1,2,43]
print(list1)

print(list1[0])

1.如果使用的下标超出了列表中值的个数,Python 将给出 IndexError 出错信息。
print(list1[5])
IndexError: list index out of range

2.下标只能是整数,不能是浮点值。下面的例子将导致 TypeError 错误:
print(list1[5.0])
TypeError: list indices must be integers or slices, not float

3.列表也可以包含其他列表值。这些列表的列表中的值,可以通过多重下标来访
问,像这样:
list = [[1, 2, 3], [4, 5, 6]]
print(list[0][1])
打印结果:
2

1.2 负数下标

虽然下标从 0 开始并向上增长,但也可以用负整数作为下标。整数值−1 指的是列表中的最后一个下标,−2 指的是列表中倒数第二个下标,以此类推。在交互式环境中输入以下代码:

list = ['cat','dog','fish']
print(list[-1])
print(list[-2])

打印结果:
fish
dog

1.3利用切片获取字列表

通过下标可以取得单个值,通过切片可以取得多个值,返回一个新列表.切片输入在一个方括号里,用冒号分割.列表和切片的区别:

  • spam[2]是一个列表和下标(一个整数)。
  • spam[1:4]是一个列表和切片(两个整数)。

在一个切片中,第一个整数是切片开始处的下标。第二个整数是切片结束处的下标。切片向上增长,直至第二个下标的值,但不包括它。切片求值为一个新的列表值。

list = ['cat','dog','fish','pig']
print(list[1:3])
print(list[0:-1])

省略第一个值是从下标为0开始,省略第二个值是截取到末尾
print(list[:2])
print(list[0:])

打印结果:
['dog', 'fish']
['cat', 'dog', 'fish']
['cat', 'dog']
['cat', 'dog', 'fish', 'pig']

1.4 用len()获取列表长度

list = ['cat','dog','fish','pig']
print(len(list))

打印结果:
4

1.5用下标该表列表的值

list = ['cat','dog','fish','pig']
list[0] = 'duck'
print(list)

打印结果:
['duck', 'dog', 'fish', 'pig']

1.6 列表连接和列表复制

+操作列表连接,* 操作列表复制

l1 = [1,2,4]
l2 = ['A','B','C']
l3 = l1 + l2
print(l3)

l2 = l2 * 3
print(l2)

打印结果:
[1, 2, 4, 'A', 'B', 'C']
['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']

1.7 使用del从列表中删除值

list = ['cat','dog','fish','pig']
del list[0]
print(list)

打印语句
['dog', 'fish', 'pig']

2.列表的使用

nameList = []
while True:
    print('please input your cat name')
    catName = input()
    nameList = nameList + [catName]
    if catName == '':
        break

for name in nameList:
    print(name)
    
执行结果:
please input your cat name
zhsnasan
please input your cat name
lisi
please input your cat name
wangwu
please input your cat name
xiaoli
please input your cat name

zhsnasan
lisi
wangwu
xiaoli

2.1 列表的循环

list = ['pens', 'staplers', 'flame-throwers', 'binders']

for i in range(len(list)):
    print('index' + str(i) + ':' + list[i])

执行结果:
index0:pens
index1:staplers
index2:flame-throwers
index3:binders

2.2 in和not in 操作符

print('heyas' in spam)
print('cat' in spam)
print('cat' not in spam)

执行结果:
True
False
True

2.3 多重赋值

cat = ['fat', 'black', 'loud']
size,color,disption = cat
print(size + ',' + color + ',' + disption)

执行结果:
fat,black,loud

注意:
变量的数目和列表的长度必须严格相等,否则 Python 将给出 ValueErrorValueError: not enough values to unpack (expected 4, got 3)

3 增强赋值操作

增强的赋值操作符
spam += 1spam = spam + 1
spam -= 1spam = spam - 1
spam *= 1spam = spam * 1
spam /= 1spam = spam / 1
spam %= 1spam = spam % 1

4 方法

方法和函数式一回事,只是他的调用在值上.每种数据类型都有一组自己的方法.

4.1 用index方法在列表中查找值

cat = ['fat', 'black', 'loud']
print(cat.index('fat'))
执行结果:
0

4.2 用 append()和 insert()方法在列表中添加值

cat.append('pipi')
cat.insert(1,'bobo')
print(cat)

执行结果:
['fat', 'bobo', 'black', 'loud', 'pipi']

append() 将元素追加到集合末尾,insert()将元素插入到指定的下标 append()和insert()方法的返回值为None

4.3用remove()从列表中删除值

cat = ['fat', 'black', 'loud']
cat.remove('fat')
print(cat)

打印结果:
['black', 'loud']

4.4 用 sort()方法将列表中的值排序

list = [1,4,2,43,22,5,3,3]
list.sort()
print(list)

打印结果:
[1, 2, 3, 3, 4, 5, 22, 43]

逆排序

list.sort(reverse=True)
print(list)

打印结果:
[43, 22, 5, 4, 3, 3, 2, 1]

字符串排序

spam = ['elephants', 'dogs', 'cats', 'badgers', 'ants']
spam.sort()
print(spam)

打印结果:
['ants', 'badgers', 'cats', 'dogs', 'elephants']

sort()方法对字符串排序时,使用“ASCII 字符顺序”,而不是实际的字典顺序。这意味着大写字母排在小写字母之前。因此在排序时,小写的 a 在大写的Z 之后。

spam = ['Alice', 'ants', 'Bob', 'badgers', 'Carol', 'cats']
spam.sort()
print(spam)

打印结果:
['Alice', 'Bob', 'Carol', 'ants', 'badgers', 'cats']

如果需要按照普通的字典顺序来排序,就在 sort()方法调用时,将关键字参数key 设置为 str.lower。

spam = ['a', 'z', 'A', 'Z']
spam.sort(key=str.lower)
print(spam)

打印结果:
['a', 'A', 'z', 'Z']

4.5 类似列表的类型字符串和元组

列表并不是唯一表示序列值的类型.字符串和列表实际上很相似,只要你任务字符串是单个文本字符的列表.

name = 'Zophen'
print(name[0])
print(name[-2])
print(name[0:3])
print('ph' in name)
for i in name:
    print('***' + i + '***')

打印结果:
Z
e
Zop
True
***Z***
***o***
***p***
***h***
***e***
***n***

4.5.1 可变和不可变数据类型

但列表和字符串在一个重要的方面是不同的。列表是“可变的”数据类型,它的值可以添加、删除或改变。但是,字符串是“不可变的”,它不能被更改。

4.5.2 元组数据类型

1.元组输入用() 不用[] 2.元组是不可变数据类型 3.如果元组中只有一个值,你可以在括号内该值的后面跟上一个逗号,表明这种情况。否则,Python 将认为,你只是在一个普通括号内输入了一个值。

4.5.3 list()和tuple()函数来转换类型

t = tuple([1,2,3])
print(t)

s = (1,2)
print(list(s))

打印结果:
(1, 2, 3)
[1, 2]

5.copy 模块的 copy()和 deepcopy()函数

在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,你可能不希望这些变动影响原来的列表或字典。要做到这一点,Python 提供了名为 copy 的模块,其中包含 copy()和 deepcopy()函数。第一个函数copy.copy(),可以用来复制列表或字典这样的可变值,而不只是复制引用。

import copy

l1 = [1,2,34]
l2 = copy.copy(l1)
l1[0] = 3
print(l1)
print(l2)

打印结果:
[3, 2, 34]
[1, 2, 34]


l1 = [1,2,[2,3,4]]
l2 = copy.copy(l1)
l1[2][1] = 1
print(l1)
print(l2)

打印结果:
[1, 2, [2, 1, 4]]
[1, 2, [2, 1, 4]]


l1 = [1,2,[2,3,4]]
l2 = copy.deepcopy(l1)
l1[2][1] = 1
print(l1)
print(l2)

打印结果:
[1, 2, [2, 1, 4]]
[1, 2, [2, 3, 4]]

小结: 1.列表是有用的数据类型,因为它们让你写代码处理一组可以修改的值,同时仅用一个变量。 2.列表是可变的,这意味着它们的内容可以改变。元组和字符串虽然在某些方面像列表,却是不可变的,不能被修改。 3.变量不直接保存列表值,它们保存对列表的“引用”。在复制变量或将列表作为函数调用的参数时,这一点很重要。因为被复制的只是列表引用,所以要注意,对该列表的所有改动都可能影响到程序中的其他变量。如果需要对一个变量中的列表修改,同时不修改原来的列表,就可以用 copy()或 deepcopy()。