Python 列表是一种可以存储多种不同类型元素的数据结构。
通过给变量分配空的中括号即可创建一个空列表。
mylist = []
接下来的示例中,我们创建了一个空列表并检查其数据类型。
cars = []
print(type(cars))
print(len(cars))
可以像数组那样使用索引来单独访问一个列表项。你也可以使用范围索引来访问多个列表项。
mylist[5]
mylist[2:7]
如果你要对列表进行遍历请参考:循环列表项。
你可以在列表参数名后边加上中括号和索引来访问单个项。
在接下来的示例中,我们创建了一个 Python 列表,然后访问第三个项。由于索引起始于 0,索引的第三个项为 2。
# Access a single item of Python List
a = [52, 85, 41, 'sum', 'str', 3 + 5j, 6.8]
# access 3rd item with index 2
x = a[2]
print(x)
print(type(x))
通过提供范围索引,你还可以该列表的子列表或多个项。
在接下来的示例中,我们创建了一个索引,然后访问从第 2 到第 5 项,除最后一个索引所指示项的总计三个项。
# Access a range of items in Python List
a = [52, 85, 41, 'sum', 'str', 3 + 5j, 6.8]
# access a range of items
x = a[1:4]
print(x)
print(type(x))
其实本文第 1. 节中已经用到了,将列表作为参数调用 Python 的全局函数就可以得到列表长度。
查找列表长度的 len() 函数语法如下:
len(listname)
该函数返回存在于列表中的项的个数。
在接下来的例子中,我们创建了一个列表,然后是要 len() 函数查出了其中所包含项的个数。
# Python List Length
cars = ['Ford', 'Volvo', 'BMW', 'Tesla']
length = len(cars)
print('Length of the list is:', length)
向 Python 列表添加元素使用列表对象的 append() 函数。使用 append() 函数的语法如下:
mylist.append(new_element)
new_element 是要追加到列表 mylist 中的新元素。
在接下来的示例中,我们新建了一个列表,然后向它追加了一个新元素。
# Python List – Append or Add Item
cars = ['Ford', 'Volvo', 'BMW', 'Tesla']
cars.append('Audi')
print(cars)
移除 Python 列表中的某项可以使用列表对象的 remove() 函数,使用该方法语法如下:
mylist.remove(thisitem)
thisitem 是要从 mylist 中移除的那一项。
remove() 函数只会移除掉该项在列表中第一次出现的那一个,其余后续的会保留。后续我们还会学到怎么将特定值的项全部移除。
接下来的示例中我们新建了一个包含多个元素的列表,然后将只出现一次的元素 5 移除。
# Remove item that is present only once in the List
mylist = [21, 5, 8, 52, 21, 87]
item = 5
# remove the item
mylist.remove(item)
print(mylist)
在接下来的示例中,我们新建了一个包含多个元素的列表,而要移除的项 21,在列表中出现了两次。
# Remove item that is present multiple times in the List
mylist = [21, 5, 8, 52, 21, 87]
item = 21
# remove the item
mylist.remove(item)
print(mylist)
执行和输出:
可以看出虽然该项出现了两次,但是只是第一次出现的那个被移除了。
在本示例中,我们自定义算法将出现过多次的给定项 21 都删除掉。
# Remove all the occurrences of an item from the List
mylist = [21, 5, 8, 52, 21, 87]
item = 21
# remove the item for all its occurrences
for r_item in mylist:
if (item == r_item):
mylist.remove(item)
print(mylist)
有三种办法可以移除掉在列表中出现过多次的给定项。
遍历列表,一旦发现匹配指定值的项,调用 remove() 方法将其移除。上一节中已做介绍,这里不再赘述。
将所有不匹配指定值的项都过滤出来。
# Remove all occurrences in List using Filter
mylist = [21, 5, 8, 52, 21, 87]
r_item = 21
# remove the item for all its occurrence
mylist = list(filter((r_item).__ne__, mylist))
print(mylist)
# Remove all occurrences in List using Filter
mylist = [21, 5, 8, 52, 21, 87]
r_item = 21
# keep the item for all its occurrence
mylist = list(filter((r_item).__eq__, mylist))
print(mylist)
只要列表含有有匹配项,即移除第一项,直到没有匹配项。
# Remove all occurrences in List using While Loop
mylist = [21, 5, 8, 52, 21, 87]
r_item = 21
# remove the item for all its occurrence
while r_item in mylist:
mylist.remove(r_item)
print(mylist)
可以使用 for 循环、while 循环或者枚举对列表中的元素进行循环遍历。接下来我们对其进行逐一介绍。
还是以异构数据类型的那个列表为例。
a = [52, 85, 41, 'sum', 'str', 3 + 5j, 6.8]
使用 while 循环依次打印列表中的所有项。
# Loop List items using While Loop
a = [52, 85, 41, 'sum', 'str', 3 + 5j, 6.8]
i = 0
while i < len(a):
print(a[i])
print(type(a[i]))
i += 1
for 配合 range 函数,可以通过索引访问遍历列表。
# Loop List items using index
a = [52, 85, 41, 'sum', 'str', 3 + 5j, 6.8]
for i in range(len(a)):
print(a[i])
执行和输出:
如果你想在遍历的时候需要使用索引的话可以使用这种方式。
或者使用增强型 for 循环无索引直接访问元素本身。
# Loop List items accessing list item directly
a = [52, 85, 41, 'sum', 'str', 3 + 5j, 6.8]
for x in a:
print(x)
使用枚举,可以同时访问元素及其索引。
# Loop List items using Enumerate
a = [52, 85, 41, 'sum', 'str', 3 + 5j, 6.8]
for i, x in enumerate(a):
print('element#', i, 'is:', x)
要统计指定值在列表中出现了多少次,可以使用列表的 count() 含税,以指定值作为参数传递给它。
接下来的示例中我们新建了一个列表,然后查找了一些指定值出现的次数。
# Python – Count the items with a specific value in the List
mylist = [6, 52, 74, 62, 85, 62, 62, 85, 6, 92, 74]
length_74 = mylist.count(74)
length_62 = mylist.count(62)
length_92 = mylist.count(92)
length_73 = mylist.count(73)
print('74 occurred', length_74, 'times in the list')
print('62 occurred', length_62, 'times in the list')
print('92 occurred', length_92, 'times in the list')
print('73 occurred', length_73, 'times in the list')
将一张列表追加到另一张列表,使用列表对象的 extend() 函数。
list1.extend(list2)
其中列表 list2 中的元素将被追加到列表 list1。
接下来的示例中,我们创建了两张列表,然后将第二张追加到第一张。
# Append a list to another list
list1 = [6, 52, 74, 62]
list2 = [85, 17, 81, 92]
list1.extend(list2)
print(list1)
执行和输出:
list1 的内容已被修改,list2 的内容被追加到原先元素的后边。## 9.2. 保留原来列表,追加另一张列表
如果你想保留原来列表的内容不被改变,复制该列表到一个变量,然后追加另一张列表到该变量。
# Append a list to another list keeping a copy of original list
list1 = [6, 52, 74, 62]
list2 = [85, 17, 81, 92]
list = list1.copy()
list.extend(list2)
print(list)
将给定值传给列表类的 index() 方法可以查出其在列表中第一次出现的位置。
index = mylist.index(item)
接下来我们新建了一个装有数字的列表,使用 index() 方法我们找到了元素 8 在列表中的索引。
# Find index when item is present in List
mylist = [21, 5, 8, 52, 21, 87]
item = 8
# search for the item
index = mylist.index(item)
print('The index of', item, 'in the list is:', index)
Python 的列表允许同一元素多次出现。这种情况下,只有第一次出现位置的索引会被返回。
# Find index when item is present multiple times in List
mylist = [21, 5, 8, 52, 21, 87, 52]
item = 52
# search for the item
index = mylist.index(item)
print('The index of', item, 'in the list is', index)
执行和输出:
元素 52 出现了两次,但是只有第一次出现位置的索引被返回了。
如果元素没有出现在列表中,使用 index() 函数你将会得到一个消息为 item is not in list 的 ValueError。
# Find Index when the specided Item is not present in List
mylist = [21, 5, 8, 52, 21, 87, 52]
item = 67
# search for the item
index = mylist.index(item)
print('The index of', item, 'in the list is', index)
要在指定位置或索引处添加一个元素,你可以使用 Python 内建类 list 的 insert() 方法。
mylist.insert(index, item)
在指定索引 index 处将会插入 item 元素。指定索引后边的元素会依次右移。
在以下实例中我们新建了一个装有数字的列表,然后我们在索引 4 处插入一个元素 36。
# Insert Item at Specified Index in List
mylist = [21, 5, 8, 52, 21, 87, 52]
item = 36
index = 4
# insert item in mylist at index
mylist.insert(index, item)
print(mylist)
以下示例我们将在列表的起始位置插入 36。我们需要提供索引 0 给 insert() 方法。
# Insert Item at Start of List
mylist = [21, 5, 8, 52, 21, 87, 52]
item = 36
index = 0 # 1st position
# insert item in mylist at index
mylist.insert(index, item)
print(mylist)
以下示例我们将在列表的结束位置插入 36。我们需要提供索引列表长度给 insert() 方法。
# Insert Item at End of List
mylist = [21, 5, 8, 52, 21, 87, 52]
item = 36
index = len(mylist)
# insert item in mylist at index
mylist.insert(index, item)
print(mylist)
如果提供给 insert() 方法的索引超出了列表的长度,结果就是将新元素追加到列表尾。
以下是一个提供的索引超出列表长度的例子。
# Insert Item with Index out of Bounds of List
mylist = [21, 5, 8, 52, 21, 87, 52]
item = 36
index = 1000 # index out of bounds of list
# insert item in mylist at index
mylist.insert(index, item)
print(mylist)
执行和输出:
相反,如果你提供了一个负值索引,新元素将会插入到列表的起始位置。
mylist = [21, 5, 8, 52, 21, 87, 52]
item = 36
index = -10 # index out of bounds of list
# insert item in mylist at index
mylist.insert(index, item)
print(mylist)
要在指定位置或索引处移除某元素,可以使用内建类 list 的 pop() 方法。该方法语法如下:
mylist.pop(index)
其中索引是可选的。如果你没有提供索引,该列表的最后一个元素将会被移除。
以下示例中我们新建了一个装有数字的列表。我们将会使用 pop() 方法以指定索引 3 移除元素。
# Remove Item at Specific Index from List
mylist = [21, 5, 8, 52, 21, 87, 52]
index = 3
# delete item in mylist at index
mylist.pop(index)
print(mylist)
要移掉列表的最后一个元素,只需要不传递任何索引给 pop() 方法即可。
# Remove Last Item of List
mylist = [21, 5, 8, 52, 21, 87, 52]
# delete last item in mylist
mylist.pop()
print(mylist)
如果你将超出列表长度的一个索引传递给 pop() 方法,你将会得到一个消息为 pop index out of range 的 IndexError。
# pop() method with index > length of list
mylist = [21, 5, 8, 52, 21, 87, 52]
index = 100 # index > length of list
mylist.pop(index)
print(mylist)
如果你将一个负值作为索引传递给 pop() 方法,该索引将被认为是一个从 1 起始的逆序索引。
比如,如果你提供 -1 作为索引给 pop(),最后一个元素将被移除。
如果你提供 -3 给 pop(),倒数第 3 个元素将被删除。
而如果你提供给索引负数的绝对值大于列表的长度,你同样会得到像上小节示例中的 IndexError。
在接下来的示例中,我们以 -2 为索引给 pop() 方法,倒数第 2 个元素将被移除。
# pop() with negative index
mylist = [21, 5, 8, 52, 21, 87, 52]
index = -2 # index < 0
mylist.pop(index)
print(mylist)
要反转一张列表里所有元素的排列顺序,或者通俗点将叫列表反转,可以使用内建类 list 的 reverse() 方法。
mylist.reverse()
另一种列表反转的方法是切片。
reversed_list = mylist[::-1]
接下来的示例中,我们创建了一个装有数字的列表。然后我们使用 reverse() 对其进行反转。
# Reverse List using reverse()
mylist = [21, 5, 8, 52, 21, 87, 52]
mylist.reverse()
print(mylist)
执行和输出:
可以看出 reverse() 是直接对原始列表进行修改。
接下来我们来使用切片反转列表。
# Reverse List using Slicing
mylist = [21, 5, 8, 52, 21, 87, 52]
mylist2 = mylist[ : : -1]
print(mylist)
print(mylist2)
执行和输出:
可以看出切片并不修改原列表,只返回一个新的反转后的列表。
接下来我们将一个装有字符串的列表进行反转。
# Reverse List of Strings
mylist = ['list', 'dict', 'set']
mylist.reverse()
print(mylist)
要对列表进行正序或逆序排序,你可以使用内建类 list 的 sort() 方法。
mylist.sort(cmp=None, key=None, reverse=False)
其中,
要对列表进行正序排列,你只需要不传入任何参数地调用列表对象的 sort() 方法。在接下来的示例中,我们新建了一个装有数字的列表,然后我们对其中的元素进行正序排列。
# Sort a List in Ascending Order
mylist = [21, 5, 8, 52, 21, 87, 52]
mylist.sort()
print(mylist)
执行和输出:
sort() 函数的默认行为是对列表元素进行正序排序。
要对列表进行逆序排序,可以传递 reverse=True 参数给 sort() 函数。
# Sort a List in Descending Order
mylist = [21, 5, 8, 52, 21, 87, 52]
mylist.sort(reverse=True)
print(mylist)
你可以通过使用 sort() 函数或者经典的 for 循环来查找一张列表中最大的那个数字。使用 sort() 函数是一种简洁的方式。但出于学习起见我们还是两种方式都看一下。
通过上一节的学习我们知道 sort() 函数将会把一张列表中的元素按正序或逆序进行排列。在你对列表排序之后,如果你的列表按正序排列那么最大的那个数字会排在列表的最后一个位置,而如果你按逆序排列它将出现在列表的起始位置。
# Find the largest number using sort() function
a = [18, 52, 23, 41, 32]
a.sort()
a_len = len(a)
ln = a[a_len - 1]
print('Largest element is', ln)
尽管使用 sort() 函数查找最大数字看起来很简单,但是使用 for 循环查找可以相对更快地执行操作,因为它对列表的操作次数更少。
# Find the largest number using for loop
a = [18, 52, 23, 41, 32]
ln = 0
for i in a:
if i > ln:
ln = i
print('Largest element is', ln)
执行和输出:
在上述示例中,我们新建了一张列表,并假设其最大数字为 0。然后我们使用 for 循环对该列表进行遍历。在每次迭代期间,我们检查该最大数字是否比当前元素小。如果是这样的话,我们将当前元素分配给最大数字。列表遍历结束以后,最大数字参数里放的数字就是列表里最大的那个数。
你可以通过使用 sort() 函数或者经典的 for 循环来查找一张列表中最小的那个数字。使用 sort() 函数是一种简洁的方式。但出于学习起见我们还是两种方式都看一下。
通过上一节的学习我们知道 sort() 函数将会把一张列表中的元素按正序或逆序进行排列。在你对列表排序之后,如果你的列表按正序排列那么最小的那个数字会排在列表的起始位置,而如果你按逆序排列它将出现在列表的最后位置。
# Find the smallest number using sort() function
a = [18, 52, 23, 41, 32]
a.sort()
sn = a[0]
print('Smallest element is', sn)
尽管使用 sort() 函数查找最小数字看起来很简单,但是使用 for 循环查找可以相对更快地执行操作,因为它对列表的操作次数更少。
# Find the smallest number using for loop
a = [18, 52, 23, 41, 32]
sn = float("inf")
for i in a:
if i < sn:
sn = i
print('Smallest element is', sn)
执行和输出:
在上述示例中,我们新建了一张列表,并假设其最小数字为无穷大。然后我们使用 for 循环对该列表进行遍历。在每次迭代期间,我们检查该最小数字是否比当前元素大。如果是这样的话,我们将当前元素分配给最小数字。列表遍历结束以后,最小数字参数里放的数字就是列表里最小的那个数。