《利用python进行数据分析》Chapter 3

本文深入解析Python中的数据结构如元组、列表、字典及集合的特性与使用技巧,涵盖序列操作、内建函数应用、列表与字典推导式等内容,同时介绍了函数的高级特性如柯里化、迭代器与生成器,以及错误处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章主要介绍python的常用数据结构以及函数的用法。

1. 数据结构和序列
1.1 元组
  1. 一种固定长度、有序且不可变的python对象序列。
tup = (4,5,6)
  1. 支持+号连接以及*号直接复制多个。
1.2 列表
  1. 有序、可变。
  2. append 尾部增加元素,insert 指定位置插入元素,后者比前者计算代价更高。
  3. pop 将特定位置的元素移除并返回该元素。
  4. remove 定位第一个符合要求的值并移除它。
  5. in/not in 检查值是否存在于列表中,需要逐个线性扫描,所以速度缓慢,而在字典和集合中是同时检查所有元素的(基于哈希表)。哈希表——是根据键(Key)而直接访问在内存储存位置的数据结构。
  6. +号以及extend命令都可以用来扩展列表,但前者是一种相对代价高的操作,因为连接过程中创建了新的列表,并且还复制了对象。
everything = []
for i in list_of_lists:
	everything.extend(i)
everything = []
for i in list_of_lists:
	everything += i
  1. 二分搜索-内建的bisect模块可实现二分搜素和已排序列表的插值。
    insort 函数:其插入的结果是不会影响原有的排序。
	data = [2,4,7,9]
	bisect.insort(data, 3)
	data
	[2,3,4,7,9]

bisect 函数:其目的在于查找该数值将会插入的位置并返回,而不会插入。

	data = [2,4,7,9]
	bisect.bisect(data, 1)
	0
	data
	[2,4,7,9]
1.3 内建序列函数
  1. enumerate 函数——返回序列值的同时返回该值的索引,多用于对数据建立索引构造字典。
for i, value in enumerate(collenction):
	# 执行语句
some_list = ['abb', 'sda', 'asdaw']
mapping = {}
for i, v in enumerate(some_list):
	mapping[v] = i
mapping
{'abb': 0, 'sda': 1, 'asdaw': 2}
  1. zip 函数——将列表、元组或其他序列的元素配对,新建一个元组构成的列表,长度由最短的序列决定。
seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']
seq3 = ['ture', 'false']
list(zip(seq1, seq2, seq3))
[('foo', 'one', 'ture'), ('bar', 'two', 'false')]

利用 * 号操作符,可以将元组解压为列表, 可以实现行的列表转换为列的列表。

seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']
seq3 = ['ture', 'false']
zipped = zip(seq1, seq2, seq3)
a, b, c = zip(*zipped)
"a  = {0}, b = {1}, c = {2}".format(a,b,c)
"a  = ('foo', 'bar'), b = ('one', 'two'), c = ('ture', 'false')"
  1. sorted 函数
    略。
    sort()方法是在原对象直接进行排序,如果直接赋值则返回为Nonetype!
list1 = list('asdnsd')
list1.sort()
list1
['a', 'd', 'd', 'n', 's', 's']

list2 = list1.sort()
type(list2)
NoneType
  1. reversed 函数
    略。
1.4 字典
  1. 可以使用关键字del或者pop方法删除字典的值。
  2. 可以使用update方法将两个字典合并。
  3. setdefault 函数——和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
dict.setdefault(key, default=None)
  1. defaultdict 类——defaultdict 的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值,defaultdict 接受一个工厂函数作为参数,这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0。
from collections import defaultdict
dict1 = defaultdict(list)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(int)

print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])

[]
set()

0

举例如下:

words = ['apple', 'bat', 'bar', 'atom', 'book']
from collections import defaultdict
by_letter = defaultdict(list)

for word in words:
    by_letter[word[0]].append(word)
    
print(type(by_letter))
print(by_letter)
dict(by_letter)


<class 'collections.defaultdict'>
defaultdict(<class 'list'>, {'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']})
{'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']}
1.5 列表、集合和字典的推导式
list_comp = [expr for val in collection if condition]
li=[i*2 for i in range(10) if i % 2 == 0] #例子
[0, 4, 8, 12, 16]

等价于以下代码

result = []
for val in collection:
	if condition:
		result.append(expr)

字典和集合的推导式

dict_comp = {key-expr : value-expr for key, value in collection  if condition}
mca={"a":1, "b":2, "c":3, "d":4} #例子
dicts={v:k for k,v in mca.items()} #例子
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}

set_comp = {expr for value in collection if condition}
squared={i*2 for i in [1,1,2]} #例子
set([2, 4])

嵌套列表推导式——列表推导式的for循环部分是根据嵌套的顺序排列的,所有的过滤条件放在尾部。

some_tuples = [(1,2,3), (4,5,6), (7,8,9)] 
flattened = [x for tup in some_tuples for x in tup]
flattened
[1, 2, 3, 4, 5, 6, 7, 8, 9]

与列表推导式中的列表推导式是有区别的。

[[x for x in tup] for tup in some_tuples]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
2. 函数
2.1 柯里化

柯里化就是将原来接收两个参数的函数变成接收一个参数的函数的过程,新的函数返回一个以原来第二个参数为参数的函数!

2.2 迭代器和生成器
  1. 迭代器就是一种用于在上下文中(比如for循环)向python解释器生成对象的对象。
  2. 生成器是构造新的可遍历对象的一种简洁的方式,需要在函数中将关键字return替换为yield。
def squares(n=10):
	print('Generating squares from 1 to {0}'.format(n**2))
	for  i in range(1, n+1):
		yield i ** 2
当你实际调用生成器时,代码并不会立即执行:
gen = squares()
gen
<generator object squares at 0x000001ADAC629848><generator object squares at 0x000001ADAC629848>
直到你请求生成器中的元素时,才会执行代码:
for i in gen:
    print(i, end = " ")
Generating squares from 1 to 100
1 4 9 16 25 36 49 64 81 100
  1. 生成器表达式——只需要将列表推导式的[]替换为()
gen = (x ** 2 for x in range(100))
gen
<generator object <genexpr> at 0x000001ADAEECB548>
2.3 错误和异常处理
f = open(path, 'w')
try:
	write_to_file(f)
except:
	print('Failed')
else:
	print('Succeeded') #当try语句代码执行成功时才执行
finally:
	f.close()
3. 文件与操作系统
3.1 打开文件进行读取或写入

内建函数open和绝对、相对路径,每次读取文件后一定更关闭close(),各种文件模式,以及属性方法。

3.2 字节与Unicode文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值