第五篇、数据类型
一、元素分类
练习1 列表的分成
练习:元素分类有如下值集合 [11,22,33,44,55,66,77,88,99,90...],执行如下。
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
set1 = [11,22,33,44,55,66,77,88,99,90] set2 = [] set3 = [] for i in set1: if i >66: set2.append(i) else: set3.append(i) print set2,set3
例子二、列表与字典结合应用
元素分类有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
li = [11,22,33,44,55,66,77,88,99,90] dic = {} for item in li: if item>66: if 'k2' in dic.keys(): dic['k2'].append(item) else: #创建只有一项元素的列表,注意如果只有一项的话要加个逗号 dic['k2'] = [item,]#这里是添加一个字典 else: if 'k1' in dic.keys(): dic['k1'].append(item) else: dic['k1'] = [item,] print dic
习题三:
在一个文件里面的内容如下,前面是代表账号,后面代表密码,最后一个是访问记录,要把这个文件读出来,生成一个如下字典模式
Alex|123|1
Eric|123|1
Tony|123|1
Dic = {
‘alex’: [123,1],
‘eric’: [123,1],
‘tony’:[123,1]
}
#步骤一、打开文件,读取文件内容 obj = file('log','r') line_list = obj.readlines() obj.close() #['xxx|123|1\n', 'Eric|123|1\n', 'Tony|123|1'],转化为字典 dic = {} for line in line_list: #去掉换行和空格 line = line.strip() #分割成列表字符串 ele_line = line.split("|") #转化为字典 dic[ele_line[0]] = ele_line[1:] print dic
为在pythcarm中不想没创建一个文件就输入utf-8这种就可以在pycharm创建模板如下所示:
二、collection系列
创建字典的方法:
1) dic = {“k”:12}
2) dic=dict(k=12)
A
1、计数器
Counter是对字典的一个补充
Class Counter(dict):
上面括号里面是dict说明这个是扩展的字典,如果里面是list那么这个就是扩展的列表
C = Counter(‘abcdefabcdabcdbacd’)
>>> import collections
>>> c=collections.Counter('abc')
>>> c=collections.Counter('abcdacbsdacbaabe')
1、
>>> c.most_common(n) →数量从大到写排列,获取前N个元素 [('a', 5), ('b', 4), ('c', 3)]
2、
1 >>> sorted(c) →列出c中各个元素 2 ['a', 'b', 'c', 'd', 'e', 's']
3、
>>> ''.join(sorted(c.elements())) →给c中的元素进行排序按照出现的次数,并且可以添加分隔符 'aaaaabbbbcccddes' >>> '|'.join(sorted(c.elements())) 'a|a|a|a|a|b|b|b|b|c|c|c|d|d|e|s'
4、
update方法,把两个字典之类的相加 >>> import collections >>> collections.Counter('aabc') Counter({'a': 2, 'c': 1, 'b': 1}) >>> c1 = collections.Counter('aabc') >>> c2 = collections.Counter('aac') >>> c1 Counter({'a': 2, 'c': 1, 'b': 1}) >>> c2 Counter({'a': 2, 'c': 1}) >>> c1.update(c2) ---》两个相加 >>> c1 Counter({'a': 4, 'c': 2, 'b': 1})
5、
clear 清除 >>> c1.clear() >>> c1 Counter()
6、
1 elements 2 这是一个迭代器,也就是说只有循环遍历才可以把迭代器里面的内容拿出来 3 For iterm in c1.elements():
7、
subtract 相减 >>> c1.subtract(c2) >>> c1 Counter({'b': 1, 'a': 0, 'c': 0})
8、
扩展列表 collections.Counter(li) >>> li = [11,12,13,12,11,44,124,11] >>> c1 = collections.Counter(li) >>> c1 Counter({11: 3, 12: 2, 44: 1, 13: 1, 124: 1})
B、有序字典 有序字典和其他字典的区别是有序字典内部进行了排序
collections.OrderedDict()
>>> o1 = collections.OrderedDict() >>> o1['k1'] = 1 >>> o1['k2'] =2 >>> o1['k3'] =3 >>> o1 OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
C、默认字典(defaultdict),为字典里的value设置默认类型my_dict = collections.defaultdict(list)
首先要明白下面的: Dic = {’k1’:None} 这个时候dic的value是none就不能用append方法,如果velue是列表,那么就可以用append方法 要解决上面的问题就要用到现在的方法my_dict = collections.defaultdict(list) 习题: 要往上面的字典里面添加元素 dic = collections.defaultdict(list) dic[’k1’].append(1) 下面的省略了。dic={},dic[’k1’]=[] dic = collections.defaultdict(list)
D、可命名的元祖 (用来表示平面图横坐标纵坐标,用来指定具体的值
方法: collections.namedtuple('mytuple',['x','y']) 创建类 使用类创建对象 使用对象 >>> import collections >>> mytuple = collections.namedtuple('mytuple',['x','y']) --》创建类mytple >>> n = mytuple(1,2) ---》使用类创建对象 >>> n --》使用对象 mytuple(x=1, y=2) --》指定元祖 >>> n.x 1 >>> n.y 2 >>> o = tuple([1,2])
三、双向队列 q = collections.deque()
双向队列有助于线程安全,双向都可以取 class deque(object): def append(): def appendleft():放到左边 def clear():清除 def count():个数 def extend():往右边添加 def extendleft():往左边添加 def pop():拿出最后的数并且删除 def popleft():拿出最左边的数并删除 Def remove():移除 Def reverse():反转这个队列 Def rotate(): 旋转 方法代码如下 >>> q = collections.deque() >>> q.append(1) >>> q.append(11) >>> q.append(12) >>> q.append(13) >>> q deque([1, 11, 12, 13]) >>> q.pop() 拿出最后的然后删除 13 >>> q deque([1, 11, 12]) >>> q.popleft() 拿出左边的然后删除 1 >>> q deque([11, 12]) >>> q.remove(11) 删除指定的元素 >>> q deque([12]) >>> q deque([12, 1, 12, 13, 14, 15]) >>> q.rotate(2) 让最后面的两个数旋转到最前面 >>> q deque([14, 15, 12, 1, 12, 13]) >>> q.rotate(-2) 把最左边的两个数旋转到最后面 >>> q deque([12, 1, 12, 13, 14, 15])
四、单向队列
单向队列只能再一边操作 import Queue >>> q = Queue.Queue(10) 创建了一个单向队列,这个队列最多可以放入10条数据 >>> q.put(1) 添加数据 >>> q.put(2) >>> q.put(3) >>> q.get() 1 >>> q.get() 取出数据 2 >>> q.get() 3 >>> q.get() 这里是夯住了,走不动了,就是必须要取出来,不取出来就在这里等着 队列和栈是不一样的 队列:FIFO 先进先出 栈: 弹夹 先进后出 队列之间的区别: 单向队列:只能从一个方向取 双向队列:两个方向都可以取
五、迭代器和生成器
1、 迭代器 >>> import collections >>> c1 = collections.Counter('1111') #创建了一个类 >>> c1.elements() <itertools.chain object at 0x000000000341FDA0> >>> d1 = c1.elements() --》创建了一个对象 >>> d1 <itertools.chain object at 0x0000000003516F98> 如果想写一个可迭代器,要创建一个类,就要写入方法,那么这个类就自动变成了一个迭代器 2、生成器 生成器是根据yeil的创建的,对于生成器只有使用时才创建,从而不避免内存浪费 range不是生成器,xrange是生成器 readlines不是生成器,xreadlines是生成器
六、下标式循环
li = [1,2,3,4,5,6] #这个循环式按照值循环 for i in li: print i #这个循环按照列表下标循环 for l in range(len(li)): print li[l] print l 冒泡排序初步: for m in range(len(li)-1): if li[m+1]>li[m]: tmp = li[m+1]+li[m] li[m+1] = tmp-li[m+1] li[m] = tmp -li[m] print li
七、内置函数
基础类型模块内存函数 help() dir() vars() type() reload(tmp) :如果第一次import之后然后对这个程序进行修改了,再想用import这个方法,那么就需要用reload方法 id([12]) 内存地址 is 比对的是地址 计算类型的 cmp(2,3) 比较 abs() 绝对值 bool() 布尔 divmod() 商和余数组成一个元祖 max() 最大值 min() 最小值 sum() 取所有和 pow(2,11) 幂 len() 求长度 all() 接收一个序列(元祖列表等),判断,如果所有值为真。返回真,否则返回假(可以用在登录系统等如果值为空就是假,也就是账号密码都不为空登录为真,有一个为空就为假) any() 和上面的相反,是只要有一个为真,就为真
下面是代码 >>> a = '' >>> bool(a) False >>> li = ['a',''] >>> all(li) False >>> any(li) True >>> any(a) False >>> li = ['a',1] >>> any(li) True
char() ASCII和数字的对照表 接收一个数字返回一个字符 char(1) ord() ASCII和数字的对照表 接收一个字符返回一个数字 char(‘a’) hex() 十六进制换算 hex(12) oct() 八进制换算oct() bin() 二进制换算
print range(10) printxrange(10) for i in xrange(10): print i for k,v in enumerate([1,2,3],指定数字的起始值): print k,v print appy(function,(‘aaaa’)) #执行函数 print map(lambda x:x+1,[1,2,3]) #all print filter(lambda x:x==1,[1,23,4])#true 序列 过滤 Groupby(xrange(6),_%3)===>{0:[0,3],1:[1,4],2:[2,5]}分组 print reduce(lambda x,y:x+y,[1,2,3]) #累加 print zip(x,y,z)