列表

字符串和元组是不可变的,而列表是可变(mutable)的,可以对它进行随意修改。我们还可以将字符串和元组转换成一个列表,只需使用 list 函数,比如:

  1. >>> s = 'hello'
  2. >>> list(s)
  3. ['h', 'e', 'l', 'l', 'o']
  4. >>> a = (1, 2, 3)
  5. >>> list(a)
  6. [1, 2, 3]

本文主要介绍常用的列表方法:

  • index
  • count
  • append
  • extend
  • insert
  • pop
  • remove
  • reverse
  • sort

index

index 方法用于从列表中找出某个元素的位置,如果有多个相同的元素,则返回第一个元素的位置。

看看例子:

  1. >>> numbers = [1, 2, 3, 4, 5, 5, 7, 8]
  2. >>> numbers.index(5) # 列表有两个 5,返回第一个元素的位置
  3. 4
  4. >>> numbers.index(2)
  5. 1
  6. >>> words = ['hello', 'world', 'you', 'me', 'he']
  7. >>> words.index('me')
  8. 3
  9. >>> words.index('her') # 如果没找到元素,则会抛出异常
  10. Traceback (most recent call last):
  11. File "<stdin>", line 1, in <module>
  12. ValueError: 'her' is not in list

count

count 方法用于统计某个元素在列表中出现的次数。

看看例子:

  1. >>> numbers = [1, 2, 3, 4, 5, 5, 6, 7]
  2. >>> numbers.count(2) # 出现一次
  3. 1
  4. >>> numbers.count(5) # 出现了两次
  5. 2
  6. >>> numbers.count(9) # 没有该元素,返回 0
  7. 0

append

append 方法用于在列表末尾增加新的元素。

看看例子:

  1. >>> numbers = [1, 2, 3, 4, 5, 5, 6, 7]
  2. >>> numbers.append(8) # 增加 8 这个元素
  3. >>> numbers
  4. [1, 2, 3, 4, 5, 5, 6, 7, 8]
  5. >>> numbers.append([9, 10]) # 增加 [9, 10] 这个元素
  6. >>> numbers
  7. [1, 2, 3, 4, 5, 5, 6, 7, 8, [9, 10]]

extend

extend 方法将一个新列表的元素添加到原列表中。

看看例子:

  1. >>> a = [1, 2, 3]
  2. >>> b = [4, 5, 6]
  3. >>> a.extend(b)
  4. >>> a
  5. [1, 2, 3, 4, 5, 6]
  6. >>>
  7. >>> a.extend(3)
  8. Traceback (most recent call last):
  9. File "<stdin>", line 1, in <module>
  10. TypeError: 'int' object is not iterable
  11. >>> a.extend([3])
  12. >>> a
  13. [1, 2, 3, 4, 5, 6, 3]

注意到,虽然 append 和 extend 可接收一个列表作为参数,但是 append 方法是将其作为一个元素添加到列表中,而 extend 则是将新列表的元素逐个添加到原列表中。

insert

insert 方法用于将某个元素添加到某个位置。

看看例子:

  1. >>> numbers = [1, 2, 3, 4, 5, 6]
  2. >>> numbers.insert(3, 9)
  3. >>> numbers
  4. [1, 2, 3, 9, 4, 5, 6]

pop

pop 方法用于移除列表中的一个元素(默认是最后一个),并且返回该元素的值。

看看例子:

  1. >>> numbers = [1, 2, 3, 4, 5, 6]
  2. >>> numbers.pop()
  3. 6
  4. >>> numbers
  5. [1, 2, 3, 4, 5]
  6. >>> numbers.pop(3)
  7. 4
  8. >>> numbers
  9. [1, 2, 3, 5]

remove

remove 方法用于移除列表中的某个匹配元素,如果有多个匹配,则移除第一个。

看看例子:

  1. >>> numbers = [1, 2, 3, 5, 6, 7, 5, 8]
  2. >>> numbers.remove(5) # 有两个 5,移除第 1 个
  3. >>> numbers
  4. [1, 2, 3, 6, 7, 5, 8]
  5. >>> numbers.remove(9) # 没有匹配的元素,抛出异常
  6. Traceback (most recent call last):
  7. File "<stdin>", line 1, in <module>
  8. ValueError: list.remove(x): x not in list

reverse

reverse 方法用于将列表中的元素进行反转。

看看例子:

  1. >>> numbers = [1, 2, 3, 5, 6, 7, 5, 8]
  2. >>> numbers.reverse()
  3. >>> numbers
  4. [8, 5, 7, 6, 5, 3, 2, 1]

sort

sort 方法用于对列表进行排序,注意该方法会改变原来的列表,而不是返回新的排序列表,另外,sort 方法的返回值是空。

看看例子:

  1. >>> a = [4, 3, 6, 8, 9, 1]
  2. >>> b = a.sort()
  3. >>> b == None # 返回值为空
  4. True
  5. >>> a
  6. [1, 3, 4, 6, 8, 9] # 原列表已经发生改变

如果我们不想改变原列表,而是希望返回一个排序后的列表,可以使用 sorted 函数,如下:

  1. >>> a = [4, 3, 6, 8, 9, 1]
  2. >>> b = sorted(a) # 返回一个排序后的列表
  3. >>> a
  4. [4, 3, 6, 8, 9, 1] # 原列表没有改变
  5. >>> b
  6. [1, 3, 4, 6, 8, 9] # 这是对原列表排序后的列表

注意到,不管是 sort 方法还是 sorted 函数,默认排序都是升序排序。如果你想要降序排序,就需要指定排序参数了。比如,对 sort 方法,可以添加一个 reverse 关键字参数,如下:

  1. >>> a = [4, 3, 6, 8, 9, 1]
  2. >>> a.sort(reverse=True) # 反向排序
  3. >>> a
  4. [9, 8, 6, 4, 3, 1]

该参数对 sorted 函数同样适用:

  1. >>> a = [4, 3, 6, 8, 9, 1]
  2. >>> sorted(a, reverse=True)
  3. [9, 8, 6, 4, 3, 1]

除了 reverse 关键字参数,还可以指定 key 关键字参数,它为每个元素创建一个键,然后所有元素按照这个键来排序,比如我们想根据元素的长度来排序:

  1. >>> s = ['ccc', 'a', 'bb', 'dddd']
  2. >>> s.sort(key=len) # 使用 len 作为键函数,根据元素长度排序
  3. >>> s
  4. ['a', 'bb', 'ccc', 'dddd']

另外,我们还可以使用 sorted 进行多列(属性)排序。

看看例子:

  1. >>> students = [
  2. ('john', 'B', 15),
  3. ('jane', 'A', 12),
  4. ('dave', 'B', 10),
  5. ('ethan', 'C', 20),
  6. ('peter', 'B', 20),
  7. ('mike', 'C', 16)
  8. ]
  9. >>>
  10. # 对第 3 列排序 (从小到大)
  11. >>> sorted(students, key=lambda student: student[2])
  12. [('dave', 'B', 10),
  13. ('jane', 'A', 12),
  14. ('john', 'B', 15),
  15. ('mike', 'C', 16),
  16. ('ethan', 'C', 20),
  17. ('peter', 'B', 20)]
  18. # 对第 2 列排序(从小到大),再对第 3 列从大到小排序
  19. >>> sorted(students, key=lambda student: (student[1], -student[2]))
  20. [('jane', 'A', 12),
  21. ('peter', 'B', 20),
  22. ('john', 'B', 15),
  23. ('dave', 'B', 10),
  24. ('ethan', 'C', 20),
  25. ('mike', 'C', 16)]

如果你想了解更多关于排序的知识,可以参考此文

小结

  • 列表是可变的。
  • 列表常用的方法有 index, count, append, extend 等。

参考资料