Python 基础二

今天学习Python的列表、集合、字典。

一、列表

你可以使用方括号创建列表。列表可以包含我们到目前为止所学的任何数据类型并且可以混合到一起。

lst_of_random_things = [1, 3.4, 'a string', True]

这是一个包含 4 个元素的类别。在 python 中,所有有序容器(例如列表)的起始索引都是 0。因此,要从上述列表中获取第一个值,我们可以编写以下代码:

>>> lst_of_random_things[0]
1

此外,你可以使用负数从列表的末尾开始编制索引,其中 -1 表示最后一个元素,-2 表示倒数第二个元素,等等。

>>> lst_of_random_things[-1] 
True
>>> lst_of_random_things[-2] 
a string

List is a type just like string,float, and int.
列表是一种类型,就像字符串、浮点型和整型。

列表切片

你发现,我们可以使用切片功能从列表中提取多个值。在使用切片功能时,务必注意,下限索引包含在内上限索引排除在外
因此:

>>> lst_of_random_things = [1, 3.4, 'a string', True]
>>> lst_of_random_things[1:2]
[3.4]

仅返回列表中的 3.4。注意,这与单个元素索引依然不同,因为你通过这种索引获得了一个列表。冒号表示从冒号左侧的起始值开始,到右侧的元素(不含)结束。

如果你要从列表的开头开始,也可以省略起始值。

>>> lst_of_random_things[:2]
[1, 3.4]

或者你要返回到列表结尾的所有值,可以忽略最后一个元素。

>>> lst_of_random_things[1:]
[3.4, 'a string', True]

这种索引和字符串索引完全一样,返回的值将是字符串。

在列表里还是不在列表里?

你发现,我们还可以使用innot in 返回一个布尔值,表示某个元素是否存在于列表中,或者某个字符串是否为另一个字符串的子字符串。

>>> 'this' in 'this is a string'
True
>>> 'in' in 'this is a string'
True
>>> 'isa' in 'this is a string'
False
>>> 5 not in [1, 2, 3, 4, 6]
True
>>> 5 in [1, 2, 3, 4, 6]
False

可变性和顺序

可变性是指对象创建完毕后,我们是否可以更改该对象。如果对象(例如列表或字符串)可以更改,则是可变的。但是,如果无法更改对象以创建全新的对象(例如字符串),则该对象是不可变的。

>>> my_lst = [1, 2, 3, 4, 5]
>>> my_lst[0] = 'one'
>>> print(my_lst)
['one', 2, 3, 4, 5]

不可变:

>>> greeting = "Hello there"
>>> greeting[0] = 'M'

这是因为,字符串是不可变的。意味着如果要更改该字符串,你需要创建一个全新的字符串。

对于你要使用的每种数据类型,你都需要注意两个事项:

  • 1、可变吗?
  • 2、有序吗?

字符串和列表都是有序的。但是,你将在后续部分看到某些数据类型是无序的。对于接下来要遇到的每种数据类型,有必要理解如何设定索引,可变吗,有序吗。了解数据结构的这些信息很有用!

此外,你将发现每种数据类型有不同的方法,因此为何使用一种数据类型(而不是另一种)在很大程度上取决于这些特性,以及如何轻松地利用这些特性!

测试

请使用列表切片记法从此列表中选择列表中的最后三个元素。提示:切片可以使用负索引!

eclipse_dates = ['June 21, 2001', 'December 4, 2002', 'November 23, 2003',
                 'March 29, 2006', 'August 1, 2008', 'July 22, 2009',
                 'July 11, 2010', 'November 13, 2012', 'March 20, 2015',
                 'March 9, 2016']

# TODO: Modify this line so it prints the last three elements of the list
eclipse_dates = eclipse_dates[-3:]
print(eclipse_dates)

常用的列表函数

  • 1、 len() 返回列表中的元素数量。
  • 2、 max() 返回列表中的最大元素。最大元素的判断依据是列表中的对象类型。数字列表中的最大元素是最大的数字。字符串列表中的最大元素是按照字母顺序排序时排在最后一位的元素。因为 max() 函数的定义依据是大于比较运算符。如果列表包含不同的无法比较类型的元素,则 max() 的结果是 undefined。
  • 3、 min() 返回列表中的最小元素。它是 max() 函数的对立面,返回列表中的最小元素。
  • 4、 sorted() 返回一个从最小到最大排序的列表副本,并使原始列表保持不变。
  • 5、join() 是一个字符串方法,将字符串列表作为参数,并返回一个由列表元素组成并由分隔符字符串分隔的字符串。
new_str = "\n".join(["fore", "aft", "starboard", "port"])
print(new_str)

输出:

fore
aft
starboard
port

在此示例中,我们使用字符串 "\n" 作为分隔符,以便每个元素之间都有一个换行符。我们还可以在 .join 中使用其他字符串作为分隔符。

append 方法

实用方法 append 会将元素添加到列表末尾。

letters = ['a', 'b', 'c', 'd']
letters.append('z')
print(letters)

输出:

['a', 'b', 'c', 'd', 'z']

二、字典

字典是可变数据类型,其中存储的是唯一键到值的映射。下面是存储元素和相应原子序数的字典。

elements = {"hydrogen": 1, "helium": 2, "carbon": 6}

字典的键可以是任何不可变类型,例如整数或元组,而不仅仅是字符串。甚至每个键都不一定要是相同的类型!我们可以使用方括号并在括号里放入键,查询字典中的值或向字典中插入新值。

print(elements["helium"])  # print the value mapped to "helium"
elements["lithium"] = 3  # insert "lithium" with a value of 3 into the dictionary

我们可以像检查某个值是否在列表或集合中一样,使用关键字 in 检查值是否在字典中。字典有一个也很有用的相关方法,叫做 get。get 会在字典中查询值,但是和方括号不同,如果没有找到键,get 会返回 None(或者你所选的默认值)。

print("carbon" in elements)
print(elements.get("dilithium"))

结果打印:

True
None

恒等运算符

关键字 运算符
is 检查两边是否恒等
is not 检查两边是否不恒等

你可以使用运算符 is 检查某个键是否返回了 None。或者使用 is not 检查是否没有返回 None。

n = elements.get("dilithium")
print(n is None)
print(n is not None)

打印:

True
False

三、集合

集合是一个包含唯一元素的可变无序集合数据类型。集合的一个用途是快速删除列表中的重复项

numbers = [1, 2, 6, 3, 1, 1, 6]
unique_nums = set(numbers)
print(unique_nums)

输出:

{1, 2, 3, 6}

集合和列表一样支持in运算符。和列表相似,你可以使用 add 方法将元素添加到集合中,并使用 pop 方法删除元素。但是,当你从集合中拿出元素时,会随机删除一个元素。注意和列表不同,集合是无序的,因此没有“最后一个元素”。

fruit = {"apple", "banana", "orange", "grapefruit"}  # define a set

print("watermelon" in fruit)  # check for element

fruit.add("watermelon")  # add an element
print(fruit)

print(fruit.pop())  # remove a random element
print(fruit)

输出结果为:

False
{'grapefruit', 'orange', 'watermelon', 'banana', 'apple'}
grapefruit
{'orange', 'watermelon', 'banana', 'apple'}

将列表转换为集合

a = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
b = set(a)
print(b)

输出:

{1, 2, 3, 4}

复合数据结构

向嵌套字典中添加值

请自己尝试处理嵌套字典。向 elements 字典中的每个字典添加另一个条目 'is_noble_gas。插入新条目后,你应该能够执行以下查询:

elements = {'hydrogen': {'number': 1, 'weight': 1.00794, 'symbol': 'H'},
            'helium': {'number': 2, 'weight': 4.002602, 'symbol': 'He'}}

# todo: Add an 'is_noble_gas' entry to the hydrogen and helium dictionaries
# hint: helium is a noble gas, hydrogen isn't

elements['hydrogen']['is_noble_gas'] = False
elements['helium']['is_noble_gas'] = True

print(elements)

四、元组

元组是另一个实用容器。它是一种不可变有序元素数据类型。通常用来存储相关的信息。请看看下面这个关于纬度和经度的示例:

location = (13.4125, 103.866667)
print("Latitude:", location[0])
print("Longitude:", location[1])

元组和列表相似,它们都存储一个有序的对象集合,并且可以通过索引访问这些对象。但是与列表不同的是,元组不可变,你无法向元组中添加项目或从中删除项目,或者直接对元组排序。

元组还可以用来以紧凑的方式为多个变量赋值。

dimensions = 52, 40, 100
length, width, height = dimensions
print("The dimensions are {} x {} x {}".format(length, width, height))

在定义元组时,小括号是可选的,如果小括号并没有对解释代码有影响,程序员经常会忽略小括号。

在第二行,我们根据元组 dimensions 的内容为三个变量赋了值。这叫做元组解包。你可以通过元组解包将元组中的信息赋值给多个变量,而不用逐个访问这些信息,并创建多个赋值语句。

如果我们不需要直接使用 dimensions,可以将这两行代码简写为一行,一次性为三个变量赋值!

length, width, height = 52, 40, 100
print("The dimensions are {} x {} x {}".format(length, width, height))

为者常成,行者常至