《利用python进行数据分析》——3.1数据结构和序列——元组、列表、字典、集合——读书笔记

第3章 Python的数据结构、函数和文件
3.1 数据结构和序列

Python中常见的数据结构可以统称为容器。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。

1.元组——tuple

  • 元组是一个固定长度,不可改变的Python序列对象。
  • 元组与列表一样,也是一种序列,唯一不同的是元组不能被修改(字符串其实也有这种特点)
  • 元组Tuple,一经初始化,就不能修改,没有列表List中的append(), insert(), pop()等修改的方法,只能对元素进行查询。
  • 元组是一种静态的数据结构,无法修改,若要修改只能重新生成新的元组。

创建元组的最简单方式,是用逗号分隔一列值:

In [1]: tup = 4, 5, 6
In [2]: tup
Out[2]: (4, 5, 6)

当用复杂的表达式定义元组,最好将值放到圆括号内,如下所示:

In [3]: nested_tup = (4, 5, 6), (7, 8)
In [4]: nested_tup
Out[4]: ((4, 5, 6), (7, 8))

(1) 元组操作包含以下函数

cmp(list1, list2):比较两个元组的元素
len(list):元组元素个数
max(list):返回元组元素最大值
min(list):返回元组元素最小值
tuple(seq):将列表转换为元组

(2) 修改元组

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
 
# 以下修改元组元素操作是非法的。
# tup1[0] = 100
 
# 创建一个新的元组
tup3 = tup1 + tup2
print(tup3)

(3) 删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组

注意:只含一个值的元组,必须加个逗号(,);

2.列表——list

  • 列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。
  • 列表中的每个元素都可变的,意味着可以对每个元素进行修改和删除;
  • 列表是有序的,每个元素的位置是确定的,可以用索引去访问每个元素;
  • 列表中的元素可以是Python中的任何对象;
  • 可以为任意对象就意味着元素可以是字符串、整数、元组、也可以是list等Python中的对象。

可以方括号定义,

a_list = [2, 3, 7, None]

也可以用list函数

tup = ('foo', 'bar', 'baz')

b_list = list(tup)

(1) 列表操作包含以下函数

cmp(list1, list2):比较两个列表的元素
len(list):列表元素个数
max(list):返回列表元素最大值
min(list):返回列表元素最小值
list(seq):将元组转换为列表

(2) 列表操作包含以下方法

list.append(obj):在列表末尾添加新的对象
list.count(obj):统计某个元素在列表中出现的次数
list.extend(seq):在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj):从列表中找出某个值第一个匹配项的索引位置
list.insert(index, obj):将对象插入列表
list.pop(obj=list[-1]):移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.remove(obj):移除列表中某个值的第一个匹配项
list.reverse():反向列表中元素
list.sort([func]):对原列表进行排序

(3) copy()与deepcopy()的区别

对于不可变的对象来说(数字,字符串,元组),深浅拷贝没有区别
深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。 
等于赋值,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
浅复制要分两种情况进行讨论:
1)当浅复制的值是不可变对象(数值,字符串,元组)时和“等于赋值”的情况一样,对象的id值与浅复制原来的值相同。
2)当浅复制的值是可变对象(列表和元组)时会产生一个“不是那么独立的对象”存在。有两种情况:
第一种情况:复制的对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。
原来值的id值与浅复制原来的值不同。
第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,
浅复制的值改变并不会影响原来的值。 但是改变原来的值 中的复杂子对象的值 会影响浅复制的值。

(4)切片

切边可以选取大多数序列类型的一部分,切片的基本形式是在方括号中使用start:stop:

In [73]: seq = [7, 2, 3, 7, 5, 6, 0, 1]
In [74]: seq[1:5]
Out[74]: [2, 3, 7, 5]

切片的起始元素是包括的,不包含结束元素。因此,结果中包含的元素个数是stop - start。

start或stop都可以被省略,省略之后,分别默认序列的开头和结尾:

In [77]: seq[:5]
Out[77]: [7, 2, 3, 6, 3]
In [78]: seq[3:]
Out[78]: [6, 3, 5, 6, 0, 1]

负数表明从后向前切片:
 

In [79]: seq[-4:]
Out[79]: [5, 6, 0, 1]
In [80]: seq[-6:-2]
Out[80]: [6, 3, 5, 6]

3.字典——dict

  • 字典可能是Python最为重要的数据结构。它更为常见的名字是哈希映射或关联数组。它是键值对的大小可变集合,键和值都是Python对象。
  • 字典中的数据必须以键值对的形式出现,即k,v: key:必须是可哈希的值,比如intmstring,float,tuple,但是list,set,dict不行 ,value:可以是任何值
  • 键不可重复,值可重复:键若重复字典中只会记该键对应的最后一个值
  • 字典中键(key)是不可变的,何为不可变对象,不能进行修改;而值(value)是可以修改的,可以是任何对象。在dict中是根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。

创建字典的方法之一是使用尖括号,用冒号分隔键和值:

d = {key1 : value1, key2 : value2 }

一个简单的字典实例:

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

也可如此创建字典:

dict1 = { 'abc': 456 }
dict2 = { 'abc': 123, 98.6: 37 

函数

说明

D

代表字典对象

D.clear()

清空字典

D.pop(key)

移除键,同时返回此键所对应的值

D.copy()

返回字典D的副本,只复制一层(浅拷贝)

D.update(D2)

将字典 D2 合并到D中,如果键相同,则此键的值取D2的值作为新值

D.get(key, default)

返回键key所对应的值,如果没有此键,则返回default

D.keys()

返回可迭代的 dict_keys 集合对象

D.values()

返回可迭代的 dict_values 值对象

D.items()

返回可迭代的 dict_items 对象

4.集合——set

  • 集合是无序的不可重复的元素的集合。你可以把它当做字典,但是只有键没有值。
  • 集合更接近数学上集合的概念。集合中每个元素都是无序的、不重复的任意对象。
  • 可以通过集合去判断数据的从属关系,也可以通过集合把数据结构中重复的元素减掉。
  • 集合可做集合运算,可添加和删除元素。
  • 集合内数据无序,即无法使用索引和分片
  • 集合内部数据元素具有唯一性,可以用来排除重复数据
  • 集合内的数据:str,int,float,tuple,冰冻集合等,即内部只能放置可哈希数据

可以用两种方式创建集合:通过set函数或使用尖括号set语句:

In [133]: set([2, 2, 2, 1, 3, 3])
Out[133]: {1, 2, 3}
In [134]: {2, 2, 2, 1, 3, 3}
Out[134]: {1, 2, 3}

(1) 固定集合构造(创建)函数 frozenset

函数

说明

frozenset()

创建一个空的固定集合对象

frozenset(iterable)

用可迭代对象创建一个新的固定集合对象

(2) 集合构造(创建)函数 set

函数

说明

set()

创建一个空的集合对象(不能用{}来创建空集合)

set(iterable)

用可迭代对象创建一个新的集合对象

(3) Python3 集合中常用的方法

方法

意义

S.add(e)

在集合中添加一个新的元素e;如果元素已经存在,则不添加

S.remove(e)

从集合中删除一个元素,如果元素不存在于集合中,则会产生一个KeyError错误

S.discard(e)

从集合S中移除一个元素e,在元素e不存在时什么都不做;

S.clear()

清空集合内的所有元素

S.copy()

将集合进行一次浅拷贝

S.pop()

从集合S中删除一个随机元素;如果此集合为空,则引发KeyError异常

S.update(s2)

用 S与s2得到的全集更新变量S

S.difference(s2)

用S - s2 运算,返回存在于在S中,但不在s2中的所有元素的集合

S.difference_update(s2)

等同于 S = S - s2

S.intersection(s2)

等同于 S & s2

S.intersection_update(s2)

等同于S = S & s2

S.isdisjoint(s2)

如果S与s2交集为空返回True,非空则返回False

S.issubset(s2)

如果S与s2交集为非空返回True,空则返回False

S.issuperset(...)

如果S为s2的子集返回True,否则返回False

S.symmetric_difference(s2)

返回对称补集,等同于 S ^ s2

S.symmetric_difference_update(s2)

用 S 与 s2 的对称补集更新 S

S.union(s2)

生成 S 与 s2的全集

发布了15 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_28660921/article/details/104201216
今日推荐