本文引用《利用Python进行数据分析·第2版》
元组tuple
元组是一个固定长度而且不可以改变的序列对象
定义元组的方法:
(1) 最简单的方法:
1 | In [23]: top = 1,2,3 |
(2) 复杂元组的定义:
1 |
|
常用方法:
tuple : 将任意序列或者迭代器转换成元组
1 |
|
count:统计频率
1 | In [50]: a = 1,2,2,3 |
访问 : 可以直接通过下标来访问
1 | In [29]: top[0] |
修改:元组的对象一旦定义便不可以修改,除非其中存储的对象是可变对象,例如:
1 | In [30]: top = 1, [1,2,3],'a' |
备注: [1,2,3] 为列表,有序的集合,可以随时添加和删除其中的元素
串联: 可以使用加法运算符把元组串联起来
1 | In [32]: top |
拆分:拆分有两种情况,一种是等量拆分,另一种是不等量拆分
等量拆分:
1 | In [34]: top = 1,2,3 |
不等量拆分,p可以分配不等长度的列表
1 | In [42]: a,*p = top |
变量拆分常用来迭代元组或者列表序列
1 | In [46]: seq = (1,2,3),(4,5,6) |
列表list
与元组相比,列表的长度和内容都是可变的
定义的方法:
1.直接定义
1 | In [52]: a_list = [1,2,3,'wt'] |
2.使用list函数,list函数在数据处理中常用来实体化迭代器和生成器
1 | In [58]: b_list = range(2,10) |
添加和删除元素:
1.使用append在列表末尾添加元素
1 | In [60]: a_list.append('wt') |
2.使用insert在指定位置上添加元素
1 | In [63]: b_list = list(b_list) |
3.使用pop去除指定的元素
1 | In [66]: b_list.pop(2) |
4.使用remove去除某个匹配值,优先去除找到的第一个
1 | In [69]: b_list = ['wt',1,2,'wt'] |
常用方法:
1.使用in去检查列表里面是否含有某个值(not ni)
1 | In [72]: 'wt' in b_list |
2.串联和组合列表
(1) 使用 + 号将两个列表串联起来1
2
3In [73]: [1,2,3] + [4,5,6]
Out[73]: [1, 2, 3, 4, 5, 6]
(2) 使用extend方法追加多个元素(添加的新对象为列表类型,与append不同的是,append添加的是单个元素)1
2
3
4
5In [76]: b_list.extend(['wt','wt'])
In [77]: b_list
Out[77]: [1, 2, 'wt', 'wt', 'wt']
区别:使用 + 号串联对象的开销比较大,因为要新建一个列表,如果对象是一个大列表的时候,使用extend追加元素会比较可取
3.使用sort()函数进行原地排序(不创建新的对象)
1 | In [80]: a = [3,2,1] |
4.切片
切片的赋值:(注意要与Numpy的特点区分开来,Numpy切片下产生的是视图,而不是新的对象)
1 | In [83]: a = [1,2,3,4,5,6,7,8,9] |
序列函数:
enumerate函数,可以返回(i,value)元组序列
1 | In [93]: for i,value in enumerate(a): #测试用例 |
sorted函数从任意序列中返回一个已经拍好序的列表(列表的元素需要为同一类型):
1 | In [96]: sorted(["dscdcsd fsdf"]) #空格为分割符 |
zip函数可以将多个列别,元组或者其它序列组合成一个新的列表
1 | In [98]: seq1 = [1,2,3] |
字典dict
字典是Python重要的数据结构,被我们称之为哈希映射或者关联数组,键和值都是python对象, 其中,值可变但键不可变
创建方法:
常用的创建方法是使用{}尖括号:1
2
3
4
5In [110]: dict = {"wt":10,"wt2":20}
In [111]: dict
Out[111]: {'wt': 10, 'wt2': 20}
访问、插入和设定:
访问、插入和设定的方式可以像数组一样
1 | In [2]: dict['wt3'] = 30 #通过访问键的方式去插入 |
删除值(同时也会删除键),使用del或者pop方法
1 | In [7]: dict |
常用方法:
通过 in 去检查字典中是否含有指定的键
1 | In [6]: 'wt2' in dict |
访问字典中所有的keys
1 | In [13]: dict.keys() |
访问字典中所有的values
1 | In [14]: dict.values() |
使用update融合字典
1 | In [16]: dict.update({"wt2":20,"wt3":30}) #使用update合并字典 |
将两个序列组合成字典
1 | In [18]: key_list = [1,2,3] |
默认值
dict的方法get和pop可以取默认值,并返回1
2
3
4
5
6#此种代码逻辑十分常见
In [33]: if key in some_dict:
...: value = some_dict[key]
...: else:
...: value = default_value
...:
常用的方法还有collections, defaultdict, setdefault
集合set
集合是无序而又没有重复元素的集合,可以看作只有键而没有值的字典
定义方法:
直接使用{}尖括号
1 | In [34]: mySet = {1,2,3} |
使用方法set
1 | In [36]: mySet = set([4,5,6]) |
常用方法:
合并,取两个集合不重复的元素,然后组合成一个新的集合,可以用union方法或者 | 运算符
1 | In [38]: set1 = {1,2,3} |
交集,取两个集合中重复的集合,然后组合成一个新的集合,可以用intersection 或者 & 运算符
1 | In [42]: set1.intersection(set2) #第一种方法,使用intersection |
所有逻辑集合操作都有另外的原地实现方法,可以直接用结果替代集合的内容。对于大的集合,这么做效率更高。
列表,集合,字典推导式
列表推导式:
1 | [expr for val in collection if condition] |
集合推导式
1 | set_comp = {expr for value in collection if condition} |
字典推导式
1 | dict_comp = {key-expr : value-expr for value in collection if condition} |
函数
函数的应用十分广泛,其中,值得注意的是,函数的返回值的形式可以多种多样,例如,返回字典1
2
3
4
5def f():
a = 5
b = 6
c = 7
return {'a':a,'b':b,'c':c}
有时候,我们需要对同一个字符串做一系列的函数操作,此时,最简单的方法是,我们把所有的方法封装成一个列表,然后再遍历执行(多函数模式)1
2
3
4
5
6
7
8
9
10
11
12def remove_punctuation(value):
return re.sub('[!#?]', '', value)
clean_ops = [str.strip, remove_punctuation, str.title] #一系列的函数名
def clean_strings(strings, ops):
result = []
for value in strings:
for function in ops: #遍历调用列表中的函数
value = function(value)
result.append(value)
return result
等同于1
2
3
4
5
6
7
8def clean_strings(strings):
result = []
for value in strings:
value = value.strip()
value = re.sub('[!#?]', '', value)
value = value.title()
result.append(value)
return result
我们还可以将函数作为另一个函数的参数,例如内置的map函数,它的作用是在一组数据上应用一个函数:1
2
3
4
5
6
7
8
9
10
11
12In [10]: def change(value):
return str(str(value) + "wt")
....:
In [7]: list = [1,2,3]
In [11]: for i in map(change,list): #将list的元素经过change()处理之后,再赋值给 i
print(i)
....:
1wt
2wt
3wt
同时,我们还可以使用lambda匿名函数,这种用法要比完整的函数声明和定义要简洁得多1
2
3
4
5
6In [3]: def double(list,f):
return [f(x) for x in list]
...:
In [4]: print(double(my_list,lambda x:x*2))
[2, 4, 6]
柯里化,部分参数的应用
柯里化是一个计算机科学术语,它的意思就是部分参数应用,由现有的函数组合成一个新的函数1
2
3
4
5
6
7
8In [5]: def add(x,y):
...: return x+y
...:
In [6]: add_one = lambda x: add(x,1) #派生出一个新函数
In [7]: print(add_one(2))
3
等同于1
2
3
4
5In [9]: from functools import partial
In [12]: add_one = partial(add,y=1)
In [13]: print(add_one(2))
3
生成器表达式
1 | In [189]: gen = (x ** 2 for x in range(100)) |
itertools模块
读写文件
读写文件一般使用with语句,不仅方便读取数据,而且在退出代码块之后会自动清理文件1
2
3
4
5In [212]: with open(path , "r") as f: #读文件
.....: lines = [x.rstrip() for x in f]
In [225]: with open('path'.txt', 'w') as handle: #写文件
.....: handle.writelines(x for x in open(path) if len(x) > 1)