Python学习之旅—字符串+元组+列表重要知识点解析

时间:2021-06-13 11:09:33

前言

  前面两次博客对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%d@live.com' % 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']
}

如上所示,我们在字典中嵌套了列表。每个被调查的人都与其关联一个语言列表。

        以上就是列表中要注意的相关点,更多的知识需要各位在平时的练习中加以熟练,并结合实际需求来设计合理的数据结构!

 


 

         本篇博客主要记录了字符串,元组,列表中的一些重点知识,希望能够对大家有帮助,达到夯实基础的目的。

 

  

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

---恢复内容结束---