---恢复内容开始---
前言
前面两次博客对Python的安装以及相关基础内容进行了整理和介绍,本次博客内容主要专注于解决字符串,列表,元组,字典等四大数据类型的主要用法。涉及到的基本用法本文在此不再赘述,因此本篇博客主要整理和讨论一些重要,易混淆的知识点。希望能够让大家抓住重点,有针对性地掌握相关知识点。
1.字符串
关于字符串所提供的一些方法,例如,去除空格,变化大小写等方法在此不再讨论。在这里大家需要关注一个比较重要的知识点,就是对原始字符串操作后会形成新的字符串,而且这两个字符串在内存中的地址值是不一样的。举例如下:
>>> name = "spark" >>> id(name) 2847482279840 >>> name.title() ‘Spark‘ >>> id(name.title()) 2847482280848
从上面的代码中可知原始字符串name的内存地址值为:2847482279840;对name调用title()方法,形成了新的字符串,其内存地址值为:2847482280848。很明显这是两个不同的字符串,原始字符串没有发生改变。如果想让原始字符串name的值为:Spark,必须在调用title()方法后,将值重新赋予给name.代码如下:
>>> name = "spark" >>> id(name) 2455126570968 >>> name = name.title() >>> id(name) 2455126571920 >>> name ‘Spark‘
从上面的代码中可知,我们将新生成的字符串name.title()再重新赋予给name,此时name的值由原来的spark变为现在的Spark,而且其内存地址值也改变了。所以大家平时在操作字符串时一定要有这样的概念,避免不必要的错误。
2.列表
我们可以将列表看作是一个可变的容器,里面可以存储各种不同的数据类型。例如,整型,字符串,元组,字典,布尔值等。比如我们定义一个列表,如下:
li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"]
在列表中,我们要注意四点,下面来详细讨论下。
【001】 追加方法append()与插入方法insert()的使用与区别:
append方法表示向列表末尾插入元素,我们只需在append方法的参数中传入我们想要插入的值即可。而insert方法表示在指定位置插入我们想要的元素,其方法需要传入2个参数,一个是位置索引,另一个是需要插入的值。而且插入的值可以是任意类型,因为列表本身就是一个大容器。我们可以看看如下的代码:
>>> li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"] >>> print(li) [11, 22, 33, [123, ‘spark‘, True, [22, 33, 44]], False, (11, 22, 33), ‘kafka‘] >>> li.append((11,22,33)) >>> print(li) [11, 22, 33, [123, ‘spark‘, True, [22, 33, 44]], False, (11, 22, 33), ‘kafka‘, (11, 22, 33)]>>> li.insert(8,[11,22,33]) >>> print(li) [11, 22, 33, [123, ‘spark‘, True, [22, 33, 44]], False, (11, 22, 33), ‘kafka‘, [11, 22, 33], [11, 22, 33], (11, 22, 33)]
【002】通过上面的例子可知,列表本身是一个变化的容器,当我们对列表进行增加,删除,修改时,这些操作会直接作用于原始的列表,我们一起来看看如下的代码,并结合列表在内存中的地址值进行分析:
>>> id(li) 2455126510408 >>> del li[3] >>> print(li) [11, 22, 33, False, (11, 22, 33), ‘kafka‘, [11, 22, 33], [11, 22, 33], (11, 22, 33)] >>> id(li) 2455126510408 >>> li[6].insert(3,44) >>> print(li) [11, 22, 33, False, (11, 22, 33), ‘kafka‘, [11, 22, 33, 44], [11, 22, 33], (11, 22, 33)] >>> id(li) 2455126510408
从上面的代码分析可知,当我们对列表进行增加,删除和修改时,会直接将操作用于原始列表,因此列表的内容会改变,但从始至终,列表li在内存中的地址值始终没有变化过。这点是与字符串的最大区别。
【003】关于列表中的第三点,我们需要注意的是,批量替换列表中的元素。同样我们结合具体代码来进行分析:
>>> name_list = ["spark", "hadoop", "cisco", "kafka"] >>> print(name_list) [‘spark‘, ‘hadoop‘, ‘cisco‘, ‘kafka‘] >>> name_list[2:4] = ["hbase", "flink", "hive", "mapreduce", "mongodb"] >>> print(name_list) [‘spark‘, ‘hadoop‘, ‘hbase‘, ‘flink‘, ‘hive‘, ‘mapreduce‘, ‘mongodb‘]
由上面的代码可知,我们想替换原始列表name_list中的最后两个元素,直接采用切片的方式指定最后两个列表的索引,然后使用列表["hbase", "flink", "hive", "mapreduce", "mongodb"]
来进行替换。同时我们发现,当替换完最后两个元素后,新的列表还有其他元素,也一起被添加到name_list中,成为了name_list的新元素。我们再来看下,如果新添加的元素为字符串,会发生什么样的情形:
>>> name_list = ["spark", "hadoop", "cisco", "kafka"] >>> name_list[2:4] = "hive" >>> print(name_list) [‘spark‘, ‘hadoop‘, ‘h‘, ‘i‘, ‘v‘, ‘e‘] >>> name_list = ["spark", "hadoop", "cisco", "kafka"] >>> name_list[2:4] = "林俊杰" >>> print(name_list) [‘spark‘, ‘hadoop‘, ‘林‘, ‘俊‘, ‘杰‘] >>>
由上面的代码分析可知,当要插入元素为一个字符串,批量替换时,列表会自动将字符串进行切分,然后将每个字符作为一个元素插入到列表中。另外,在上例中,我们需要批量替换列表中索引位置为2和3的元素,但是如果替换的元素只有一个会发生什么样的情形,看如下代码:
>>> name_list = ["spark", "hadoop", "cisco", "kafka"] >>> name_list[2:4] = ["hbase",] >>> print(name_list) [‘spark‘, ‘hadoop‘, ‘hbase‘]
从上面的代码中可知,当替换的元素个数小于被替换的元素个数时,只会将替换的元素替代原始被替换的元素。就像上面使用hbase替换cisco,而没有元素来替换kafak,所以最后列表元素变为:[‘spark‘, ‘hadoop‘, ‘hbase‘]。另外要注意,我们习惯将只有1个列表的元素写为["hbase",],虽然可以去掉列表中的逗号。但在Python中加一个逗号是约定俗成的,这点还请大家注意。
3.元祖
我们可以将元组看作是一个不可变的容器,即其里面的元素值是不可变的。大家主要注意的是元组与列表的混合使用,我们来看一个例子:
>>> li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"] >>> print(li) [11, 22, 33, [123, ‘spark‘, True, [22, 33, 44]], False, (11, 22, 33), ‘kafka‘] >>> li[-2].append(22) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: ‘tuple‘ object has no attribute ‘append‘ >>>
从上面的代码可知,li[-2]的元素值是一个元组(11, 22, 33),当我们想对元组进行添加元素时会报错,这是因为元组中的元素是不可变的。我们再来看如下一个可能令大家困惑的例子:
>>> name_tuple = (1,2,3,[11,22,33]) >>> name_tuple[-1].append(44) >>> print(name_tuple) (1, 2, 3, [11, 22, 33, 44])
元组name_tuple的最后一个元素是一个列表,因此我们可以对列表进行添加元素,所以name_tuple[-1].append(44)可以执行成功。我们可以将li = [11,22,33],我们仅仅是对元组中的列表进行修改,而元组本身的元素并没有发生改变。这也是区别于上面例子的地方,希望大家能够好好体会。
4.字典
我们可以将字典看作是键值对的集合,即字典中的元素是一个个的键值对。关于字典,我们需要主要如下几点:
【001】通过key来获取value元素:get方法。我们来看下面的例子:
>>> dict = {"k1": "v1", "k2": "v2"} >>> dict.get(‘k1‘) ‘v1‘ >>> dict.get(‘k3‘) >>> dict[‘k1‘] ‘v1‘ >>> dict[‘k3‘] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: ‘k3‘
从上面的代码中可知,当我们通过get方法根据key来获取value时,如果key不存在,返回值为None,它不会报错。但是使用dict[‘k3‘]获取value值时,如果key不存在,那么会报错。
【002】关于字典我们需要注意的第二点是嵌套。在实际项目中,我们往往有一系列的需求,例如将一系列字典存储在列表中,或者将列表作为值存储在字典中,甚至可以在字典中嵌套字典。我们可以通过如下的代码进行说明:
# 在列表中嵌套字典user_list = [] for user_number in range(1, 302): new_user = {‘user‘: ‘alex-%d‘ % user_number, ‘email‘: ‘alex%[email protected]‘ % user_number, ‘pwd‘: ‘pwd%d‘ % user_number} user_list.append(new_user)
上面代码演示了如何在列表中嵌套字典,列表的元素是一个一个的字典,如果我们想取出列表中的元素,可以使用如下的代码:
for user in user_list[:10]: print(user)
下面我们接着来看如何在字典中嵌套列表:
favorite_language = { ‘alex‘: [‘python‘, ‘go‘], ‘sara‘: [‘c‘], ‘carson‘: [‘ruby,‘go‘], ‘tom‘: [‘java‘,‘python‘] }
如上所示,我们在字典中嵌套了列表。每个被调查的人都与其关联一个语言列表。
以上就是列表中要注意的相关点,更多的知识需要各位在平时的练习中加以熟练,并结合实际需求来设计合理的数据结构!
本篇博客主要记录了字符串,元组,列表中的一些重点知识,希望能够对大家有帮助,达到夯实基础的目的。
---恢复内容结束---