12. Python的列表操作

《Python编程的术与道:Python语言入门》视频课程
《Python编程的术与道:Python语言入门》视频课程链接:https://edu.csdn.net/course/detail/27845

常用列表操作

改变列表中的元素

如果知道元素的位置,则可以更改列表中任何元素的值。

dogs = ['border collie', 'poodle', 'german shepherd']

dogs[0] = 'australian shepherd'
print(dogs)
['australian shepherd', 'poodle', 'german shepherd']

查找列表中的元素

如果要查找列表中元素的位置,可以使用index()函数。

dogs = ['border collie', 'poodle', 'german shepherd']

print(dogs.index('poodle'))
1

如果请求的item不在列表中,则此方法返回ValueError。

dogs = ['border collie', 'poodle', 'german shepherd']

print(dogs.index('australian cattle dog'))
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-3-ca42217e4b30> in <module>
      1 dogs = ['border collie', 'poodle', 'german shepherd']
      2 
----> 3 print(dogs.index('australian cattle dog'))


ValueError: 'australian cattle dog' is not in list

测试元素是否在列表中

可以使用in关键字测试一个item是否在列表中。 在学习如何使用if-else语句之后,这将变得更有用。

dogs = ['border collie', 'poodle', 'german shepherd']

print('australian cattle dog' in dogs)
print('poodle' in dogs)
False
True

添加元素到列表

将元素附加到列表的末尾

可以使用append()方法将项添加到列表中。 此方法将新元素添加到列表的末尾。

dogs = ['border collie', 'australian cattle dog', 'labrador retriever']
dogs.append('poodle')

for dog in dogs:
    print(dog.title() + "s are cool.")
Border Collies are cool.
Australian Cattle Dogs are cool.
Labrador Retrievers are cool.
Poodles are cool.

插入元素到列表中

还可以使用 insert() 函数在列表中的任何位置插入项。 指定希望指定元素的位置,从该点开始的所有位置都向右移动一个位置。 换句话说,新元素之后的每个元素的索引增加1。

dogs = ['border collie', 'australian cattle dog', 'labrador retriever']
dogs.insert(1, 'poodle')

print(dogs)
['border collie', 'poodle', 'australian cattle dog', 'labrador retriever']

请注意,必须先给出新元素的位置,然后再给出新元素的值。 如果以相反的顺序执行此操作,则会出现错误。

合并两个列表

在Python中,有几种方法可以合并(join)或拼接(concatenate)两个或多个列表。

最简单的方法之一是使用+运算符。

list1 = ["a", "b" , "c"]
list2 = [1, 2, 3]

list3 = list1 + list2
print(list3)
['a', 'b', 'c', 1, 2, 3]
list1 = ["a", "b" , "c"]
list2 = [1, 2, 3]

for x in list2:
  list1.append(x)

print(list1)
['a', 'b', 'c', 1, 2, 3]

insert() Inserts an item at a given position

extend() Extends the list by appending all the items from the iterable

list1 = ["a", "b" , "c"]
list2 = [1, 2, 3]

list1.extend(list2)
print(list1)
['a', 'b', 'c', 1, 2, 3]

列表复制 (List Replication)

L = ['red']
L = L * 3
print(L)    # ['red', 'red', 'red']
['red', 'red', 'red']

创建空列表

现在我们已经学习如何了在创建列表后将item添加到列表中。实际上,我们可以更加动态地使用列表, 而不再一次定义整个列表。

常用方法是首先定义一个空列表,然后让程序根据需要将元素添加到列表中。 例如,当开始构建交互式网站时,用户列表可能开始为空,然后当人们注册该站点时,它将会增长。

下面是一个简短的示例,说明如何从空列表开始,开始填充它,并使用列表中的元素。 这里唯一的新功能是定义一个空列表的方式,它只是一组空的方括号。

# Create an empty list to hold our users.
usernames = []

# Add some users.
usernames.append('ben')
usernames.append('calvin')
usernames.append('allen')

# Greet all of our users.
for username in usernames:
    print("Welcome, " + username.title() + '!')
Welcome, Ben!
Welcome, Calvin!
Welcome, Allen!

如果列表中元素的顺序不改变,我们可以使用该列表来确定最老和最新用户。

# Create an empty list to hold our users.
usernames = []

# Add some users.
usernames.append('ben')
usernames.append('calvin')
usernames.append('allen')

# Greet all of our users.
for username in usernames:
    print("Welcome, " + username.title() + '!')

# Recognize our first user, and welcome our newest user.
print("\nThank you for being our very first user, " + usernames[0].title() + '!')
print("And a warm welcome to our newest user, " + usernames[-1].title() + '!')
Welcome, Ben!
Welcome, Calvin!
Welcome, Allen!

Thank you for being our very first user, Ben!
And a warm welcome to our newest user, Allen!

请注意,因为使用了索引-1,欢迎最新用户的代码将始终有效。 如果使用索引2,我们总是会得到第三个用户。

列表排序

我们可以按字母顺序对列表进行排序。

students = ['bern', 'allen', 'calvin']

# Put students in alphabetical order.
students.sort()

# Display the list in its current order.
print("Our students are currently in alphabetical order.")
for student in students:
    print(student.title())

#Put students in reverse alphabetical order.
students.sort(reverse=True)

# Display the list in its current order.
print("\nOur students are now in reverse alphabetical order.")
for student in students:
    print(student.title())
Our students are currently in alphabetical order.
Allen
Bern
Calvin

Our students are now in reverse alphabetical order.
Calvin
Bern
Allen

sorted() vs. sort()

使用sort()对列表进行排序时,请记住你将无法恢复原始列表。 如果要按排序顺序显示列表,但仍然保留原始顺序,则可以使用sorted()函数。 sorted()函数也接受可选的reverse=True 参数。

students = ['ben', 'allen', 'calvin']

# Display students in alphabetical order, but keep the original order.
print("Here is the list in alphabetical order:")
for student in sorted(students):
    print(student.title())

# Display students in reverse alphabetical order, but keep the original order.
print("\nHere is the list in reverse alphabetical order:")
for student in sorted(students, reverse=True):
    print(student.title())

print("\nHere is the list in its original order:")
# Show that the list is still in its original order.
for student in students:
    print(student.title())
Here is the list in alphabetical order:
Allen
Ben
Calvin

Here is the list in reverse alphabetical order:
Calvin
Ben
Allen

Here is the list in its original order:
Ben
Allen
Calvin

list.sort方法会“就地排序”列表,也就是说不会把原列表复制一份。这也是这个方法的返回值是None的原因,提醒你本方法不会新建一个列表。

list.sort相反的是内置函数sorted,它会新建一个列表作为返回值。

列表倒序

我们已经看到了一个列表的三个可能顺序:

  • 创建列表的原始顺序
  • 按字母顺序
  • 反向字母顺序

我们可以使用另外一个顺序,这与列表的原始顺序相反。 reverse() 函数给出这个顺序

students = ['ben', 'allen', 'calvin']
students.reverse()

print(students)
['calvin', 'allen', 'ben']

注意,倒序操作是永久性的。当然,你可以跟着使用另一个reverse()调用并返回列表的原始顺序。

排序数字列表

所有排序函数也适用于数字列表。

numbers = [1, 3, 4, 2]

# sort() puts numbers in increasing order.
numbers.sort()
print(numbers)

# sort(reverse=True) puts numbers in decreasing order.
numbers.sort(reverse=True)
print(numbers)

[1, 2, 3, 4]
[4, 3, 2, 1]
numbers = [1, 3, 4, 2]

# sorted() preserves the original order of the list:
print(sorted(numbers))
print(numbers)
[1, 2, 3, 4]
[1, 3, 4, 2]
numbers = [1, 3, 4, 2]

# The reverse() function also works for numerical lists.
numbers.reverse()
print(numbers)
numbers.reverse()
print(numbers)
[2, 4, 3, 1]
[1, 3, 4, 2]

得到列表长度

可以使用len()函数得到列表的长度。

usernames = ['ben', 'calvin', 'allen']
user_count = len(usernames)

print(user_count)
3

len() 函数返回一个整数,不能直接用字符串打印。 我们使用str() 函数将整数转换为字符串,以便打印:

usernames = ['ben', 'calvin', 'allen']
user_count = len(usernames)

print("This will work: " + str(user_count))
This will work: 3

从列表删除元素

列表是一个动态结构。 可以定义一个空列表,然后在信息进入程序时将其填满。 为支持频繁的动态,需要一些方法在不再需要时从列表中删除元素。 可以通过其位置或值来从列表中删除项。

通过位置删除item

如果知道列表中项目的位置,则可以使用del命令删除该元素。 使用此方法,要给出输入命令del和列表名称,以及在方括号指定移除的元素的索引:

dogs = ['border collie', 'australian cattle dog', 'labrador retriever']
# Remove the first dog from the list.
del dogs[0]

print(dogs)
['australian cattle dog', 'labrador retriever']

通过值删除item

如果你知道其值,也可以从列表中删除该元素。 为此,使用remove()函数。 给出列表的名称,然后在括号中输入要删除的元素的值。 Python查看列表,找到具有此值的第一个项,并将其删除。

dogs = ['border collie', 'australian cattle dog', 'labrador retriever']
# Remove australian cattle dog from the list.
dogs.remove('australian cattle dog')

print(dogs)
['border collie', 'labrador retriever']

但请注意,仅删除具有此值的第一个元素。 如果有多个具有相同值的项,则列表中将保留其它具有此值的元素。

letters = ['a', 'b', 'c', 'a', 'b', 'c']
# Remove the letter a from the list.
letters.remove('a')

print(letters)
['b', 'c', 'a', 'b', 'c']

删除所有元素

使用clear()方法从列表中删除所有元素。

letters.clear()

print(letters)
[]

从列表弹出元素

编程中有一个很酷的概念叫做pop元素。 每种编程语言都有某种类似于Python列表的数据结构。 所有这些结构都可以用作队列,并且有各种方法来处理队列中的元素。

一种简单的方法是从空列表开始,然后将元素添加到该列表。 如果要处理列表中的元素,则始终从列表中取出最后一个元素,对其执行某些操作,然后删除该元素。pop()函数使这种操作很容易。 它会从列表中删除最后一元素,并将其提供给我们,以便使用它。

dogs = ['border collie', 'australian cattle dog', 'labrador retriever']
last_dog = dogs.pop()

print(last_dog)
print(dogs)
labrador retriever
['border collie', 'australian cattle dog']

这是先进后出方法的一个例子。

实际上,你可以通过提供要弹出的元素的索引来从列表中弹出所需的任何元素。 所以我们可以通过弹出列表中的第一个元素来做一个先进先出的方法:

dogs = ['border collie', 'australian cattle dog', 'labrador retriever']
first_dog = dogs.pop(0)

print(first_dog)
print(dogs)
border collie
['australian cattle dog', 'labrador retriever']

数字列表

数字列表没有什么特别之处,但是你可以使用一些函数来更有效地处理数字列表。 让我们列出前十个数字,然后开始使用它来查看如何在列表中使用数字。

# Print out the first ten numbers.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for number in numbers:
    print(number)
1
2
3
4
5
6
7
8
9
10

range() 函数

上面的做法是有效的,但如果想要使用大量数字,效率就不高。 range() 函数可帮助我们生成长的数字列表。 以下是使用range 函数执行相同操作的两种方法。

# Print the first ten numbers.
for number in range(1,11):
    print(number)
1
2
3
4
5
6
7
8
9
10

range函数接收起始数字和结束数字。 你得到所有整数,但不包括结尾数字。 你还可以添加一个step值,告诉range函数在数字之间采取的步长有多大:

# Print the first ten odd numbers.
for number in range(1,21,2):
    print(number)
1
3
5
7
9
11
13
15
17
19

如果想将这些数字存储在列表中,可以使用list()函数。 此函数接收一个范围,并将其转换为一个列表:

# Create a list of the first ten numbers.
numbers = list(range(1,11))
print(numbers)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

这非常强大; 我们现在可以创建一个前一百万个数字的列表,就像列出前十个数字一样容易。 在这里打印百万个数字并没有多大意义,但可以证明该列表中确实有一百万个项,我们可以打印最后十个项以显示该列表是正确的。

# Store the first million numbers in a list.
numbers = list(range(1,1000001))

# Show the length of the list:
print("The list 'numbers' has " + str(len(numbers)) + " numbers in it.")

# Show the last ten numbers:
print("\nThe last ten numbers in the list are:")
for number in numbers[-10:]:
    print(number)
The list 'numbers' has 1000000 numbers in it.

The last ten numbers in the list are:
999991
999992
999993
999994
999995
999996
999997
999998
999999
1000000

表达式 str(len(numbers))获取numbers列表的长度,并将其转换为可以打印的字符串。

表达式numbers[-10:]给我们一个列表的切片。 索引“-1”是列表中的最后一个元素,索引“-10”是列表末尾倒数第10个元素。 因此切片numbers [-10:]为我们提供了从该元素到列表末尾的所有内容。

min(), max(), 和 sum() 函数

可以对使用数字列表使用三种函数。 min()函数返回列表中的最小数字,max() 函数返回列表中的最大数字,sum()函数返回列表中所有数字的总和。

ages = [23, 16, 14, 28, 19, 11, 38]

youngest = min(ages)
oldest = max(ages)
total_years = sum(ages)

print("Our youngest reader is " + str(youngest) + " years old.")
print("Our oldest reader is " + str(oldest) + " years old.")
print("Together, we have " + str(total_years) + 
      " years worth of life experience.")
Our youngest reader is 11 years old.
Our oldest reader is 38 years old.
Together, we have 149 years worth of life experience.
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bai666ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值