[关闭]
@zhangyu756897669 2017-08-27T15:16:50.000000Z 字数 3947 阅读 527

Python官方文档13.0

python官方文档


使用sort()方法对列表中的值进行排序

可以使用sort()方法对数字值或字符串列表进行排序。

  1. spam = [2, 5, 3.14, 1, -7]
  2. spam.sort()
  3. spam

[-7, 1, 2, 3.14, 5]

  1. spam = ['ants', 'zhang', 'yu', 'badgers', 'elephants']
  2. spam.sort()
  3. spam

['ants', 'badgers', 'elephants', 'yu', 'zhang']

您也可以为reverse关键字参数传递True,以使sort()以相反的顺序对值进行排序。

  1. spam.sort(reverse=True)
  2. spam

['zhang', 'yu', 'elephants', 'badgers', 'ants']

sort()的使用方法需注意三点:

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

['Alice', 'Bob', 'Carol', 'ants', 'badgers', 'cats']

如果您需要按正常字母顺序对值进行排序,请传递str。在sort()方法调用中的Key关键字输入参数lower

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

['a', 'A', 'z', 'Z']

这是因为sort()功能将列表中的所有项目视为小写而排序,但不会更改列表中的值。

示例程序:8个魔术球

使用列表,您可以编写前一章Magic 8 Ball程序的更为优雅的版本。而不是几行几乎相同的elif语句,您可以创建代码使用的单个列表。

  1. import random
  2. messages = ['It is certain',
  3. 'It is decidedly so',
  4. 'Yes definitely',
  5. 'Reply hazy try again',
  6. 'Ask again later',
  7. 'Concentrate and ask again',
  8. 'My reply is no',
  9. 'Outlook not so good',
  10. 'Very doubtful']
  11. print(messages[random.randint(0, len(messages) - 1)])

It is decidedly so

列表类型:字符串和元组

列表不是唯一表示有序序列值的数据类型。例如,如果您将字符串视为单个文本字符的“列表”,则字符串和列表实际上类似。 您可以使用列表执行的许多操作也可以使用字符串: 索引;切片;并使用它们与for循环,使用len(),以及in和not在运算符中。

  1. name = 'Zophie'
  2. name[0]

'Z'

  1. name[-2]

'i'

  1. name[0:4]

'Zoph'

  1. 'Zo' in name

True

  1. 'z' in name

False

  1. 'p' not in name

False

  1. for i in name:
  2. print(i)

Z
o
p
h
i
e

可变和不可变数据类型

列表和字符串在一个重要的方面是不同的。列表值是可变数据类型:它可以添加,删除或更改值。然而,一个字符串是不可变的:它不能被改变。尝试重新分配字符串中的单个字符会导致TypeError错误

  1. name = 'Zophie a cat'
  2. name[7] = 'the'

字符串的正确方法是使用切片和连接来通过从旧字符串的部分复制来构建一个新的字符串

  1. name = 'Zophie a cat'
  2. newName = name[0:7] + 'the' + name[8:12]
  3. name

'Zophie a cat'

  1. newName

'Zophie the cat'

我们使用[0:7]和[8:12]来指代我们不想替换的字符。请注意,原始的“Zophie a cat”字符串不会被修改,因为字符串是不可变的。

虽然列表值是可变的,以下代码中的第二行不会修改列表中的列:

  1. eggs = [1, 2, 3]
  2. eggs = [4, 5, 6]
  3. eggs

[4, 5, 6]

egg中的列表值不会在这里改变;而是一个全新的和不同的列表值([4,5,6])正在覆盖旧的列表值([1,2,3])

如果您想要修改egg中的原始列表以包含[4,5,6],则必须执行以下操作:

  1. eggs = [1, 2, 3]
  2. del eggs[2]
  3. del eggs[1]
  4. del eggs[0]
  5. eggs.append(4)
  6. eggs.append(5)
  7. eggs.append(6)
  8. eggs

[4, 5, 6]

更改可变数据类型的值(如上一个示例中del语句和append()方法所做的更改)会改变该值,因为变量的值不会被新的列表值替换。

元组数据类型

  1. eggs = ('hello', 42, 0.5)
  2. eggs[0]

'hello'

  1. ```
  2. >(42, 0.5)
  1. len(eggs)

3

  1. eggs = ('hello', 42, 0.5)
  2. eggs[1] = 99
  1. type(('hello',))

tuple

  1. type(('hello'))

str

使用list()和tuple()函数转换类型

  1. tuple(['cat', 'dog', 5])

('cat', 'dog', 5)

  1. list(('cat', 'dog', 5))

['cat', 'dog', 5]

  1. list('hello')

['h', 'e', 'l', 'l', 'o']

如果您需要一个可变版本的元组值,将元组转换为列表是方便的。

补充

变量存储字符串和整数值。

  1. spam = 42
  2. cheese = spam
  3. spam = 100
  1. spam

100

  1. cheese

42

但是列表不能这样工作。当您将一个列表分配给一个变量时,您实际上将一个列表引用分配给该变量。引用是指向某些数据位的值,列表引用是指向列表的值。这是一些区别使代码更容易理解。

  1. #❶
  2. spam = [0, 1, 2, 3, 4, 5]
  3. #❷
  4. cheese = spam
  5. #❸
  6. cheese[1] = 'Hello!'
  1. spam

[0, 'Hello!', 2, 3, 4, 5]

  1. cheese

[0, 'Hello!', 2, 3, 4, 5]

这可能对你来说看起来很奇怪。代码只更改了cheese列表,但是cheese和spam列表都已更改。

创建列表❶时,您可以在spam变量中为其分配引用。但是下一行❷只将spam中的列表引用副本复制到cheese,而不是列表值本身。这意味着存储在spam和cheese中的值现在都指向相同的列表。只有一个基础列表,因为列表本身从未被实际复制。所以当你修改cheese❸的第一个元素时,你正在修改spam所指的相同列表。

参考知识

引用对于理解参数如何传递给函数特别重要。当函数被调用时,参数的值被复制到参数变量中。 对于列表(和字典,我将在下一章中介绍),这意味着引用的副本用于参数

  1. def eggs(someParameter):
  2. someParameter.append('Hello')
  3. spam = [1, 2, 3]
  4. eggs(spam)
  5. print(spam)

[1, 2, 3, 'Hello']

请注意,当调用egg()时,不会使用返回值来为spam分配新值。而是直接修改列表。

即使spam和someParameter包含单独的引用,它们都引用相同的列表。这就是为什么在函数调用返回之后函数中的append('Hello')方法调用会影响列表。

记住:忘记Python以这种方式处理列表和字典变量可能会导致混乱的错误。

复制模块的copy()和deepcopy()函数

  1. import copy
  2. spam = ['A', 'B', 'C', 'D']
  3. cheese = copy.copy(spam)
  4. cheese[1] = 42
  1. spam

['A', 'B', 'C', 'D']

  1. cheese

['A', 42, 'C', 'D']

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注