python数据处理(一)

学习笔记

使用python进行数据处理(一)

字典

{}括起来的就是字典,大概用法如下:

dic = {}
dic[3] = 4
dic["sfe"] = 2
# 查看变量是否在字典中
if var in dic:
    code
if var not in dic:
    code
# 设定默认值(如果当前已经存在则不会修改值)
dic.setdefault(key, val)

所有key都带默认值的字典:

# 默认值是int类型,就是int() = 0
from collections import defaultdict
dic = defaultdict(int)

有个OrderedDict可以记住插入的顺序。

遍历字典:

for key, value in dic.items():
for key in dic.keys():
for value in dic.values():

计数器

from collections import Counter
words = sentence.split()
cnt = Counter(words)
print cnt[key]

字典套字典:
要用一个lambda函数

dic2 = defaultdict(lambda :defaultdict(int))
dic2[key1][key2] = value

python数组tuple

支持in 和 not in 操作

支持求min(), max()

顺序存储, 不可改变值,可以连接

可以在里面嵌套一个可以改变值的容器,比如list

tup1 = 1, 2, 3
tup2 = (1, 2, 3)
tup3 = tup1 + tup2
# 切片
a[1:]
a[1:3]
a[1:6:2]
a[:-1]
# 逆序输出
a[::-1]

python里负数的下标是有意义的,就是从后往前数的值。

tuple可以作为字典的key

namedtuple如果只存储数据的话类似c的结构体。

set

str = "a b c d"
Set = set(str.split())
num = len(Set)
Seti = Set1.intersection(Set2)
Setu = Set1.union(Set2)
# 比较两个相同长度的数组有多少个一样的值(同一位置)
print jaccard_similarity_score(a,b)
# 对于统计来说,可以这样做
a = [ 1 if w in str1 else 0 for w in unionstr]
# 以上代码相当于排序去重后检验两个数组是否存在对应的值
# 这样就可以直接调用上面那个函数了

list

list的切片和tuple是一样的,区别主要在于list可以改变。

可以当stack和queue用。

range生成的是一个list

a = []
a.append(val)
a.pop()
a.pop(0) # 这就是从前面pop了

from random import shuffle
shuffle(a)
a.sort()
a.reverse()
b = range(2,23)
a.extend(b) # 连接list


# 一些用法
b = [pow(x, 2) for x in a if x < 0]
b = {x:pow(y, 2) for x, y in dic.items()}
# 可以写一个函数代替pow就可以实现数据筛选等功能
b = tuple(process(x) for x in a)

iterator, generator, iterable

iterator实际上就是一个提供迭代方法的类。

需要定义iter() 和 next()两个函数

对于实现了迭代器的方法可以比较方便的遍历

# 文件是可以使用迭代器按行遍历的
f = open("file")
for item in iter(f):
    print item

具体如何先不管了。。。

# 编写一个generator
def mgen(low, high):
    for x in range(low, high):
        yield x**2

for i in mgen(1, 20):
    code

与一般函数的区别就是最后返回用yield

函数

# 函数赋值
def fun(a):
asdf = fun
asdf(a)

可以在一个函数里嵌套定义函数。

函数的参数也可以是函数。

还可以返回函数。

(python的类型还真是随意。。。
但是作为c过来的, 感觉并不会经常用这种东西)

装饰器

装饰器提供了一种代码复用方式,不过需要程序逻辑符合切片处理的模式。

lambda函数
# 匿名函数
# x是参数,冒号后是返回值
lambda x: x**2
# 相当于
def f(x):
    return x**2
f(x)
map函数
# 遍历一遍迭代器,对每个元素作用函数func
# 返回一个list
map(func, iterable)
# 经常与匿名函数一起用
# 可以传多个参数,此时传入的数组长度必须相同
map(pow, a, b)
# 则a, b分别作为函数的第一个和第二个参数
选择器(filter)
# 每个元素用func检验,返回一个都是true的list
Filter(func, iterable)
zip, * 和 ** 操作符
zip(a, b)
# 把两个list成对打包起来
x, y = zip(*c)
# 打包的逆过程, 但是把第一行的结果再用第二行处理后
# 并不能得到原来的a, b.....
# 这个可以用在函数传参数上
a = (2, 3)
pow(*a)
# **可以用来处理字典,得到若干有值的变量
def func(a, b):
return a * b

dic = {'a': 3, 'b': 4}
func(**dic)

# 任意参数的函数
def func(*args):
# 这个args实际上就是一个tuple

zip在打包的时候要算出两个iterable的所有值。
而izip可以在使用值的时候再计算。

reference

1.Gopi Subramanian, Python Data Science Cookbook