第五篇、数据类型

一、元素分类

练习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
View Code

例子二、列表与字典结合应用

元素分类有如下值集合 [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
View Code

习题三:

在一个文件里面的内容如下,前面是代表账号,后面代表密码,最后一个是访问记录,要把这个文件读出来,生成一个如下字典模式

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
View Code

为在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)]
View Code

2、

1 >>> sorted(c)                →列出c中各个元素
2 ['a', 'b', 'c', 'd', 'e', 's']
View Code

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'
View Code

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})
View Code

5、

clear  清除
>>> c1.clear()
>>> c1
Counter()
View Code

6、

1 elements
2 这是一个迭代器,也就是说只有循环遍历才可以把迭代器里面的内容拿出来
3 For iterm in c1.elements():
View Code

7、

subtract  相减
>>> c1.subtract(c2)
>>> c1
Counter({'b': 1, 'a': 0, 'c': 0})
View Code

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})
View Code

B、有序字典   有序字典和其他字典的区别是有序字典内部进行了排序

collections.OrderedDict()

>>> o1 = collections.OrderedDict()
>>> o1['k1'] = 1
>>> o1['k2'] =2
>>> o1['k3'] =3
>>> o1
OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
View Code

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) 
View Code

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])
View Code

三、双向队列   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])
View Code

四、单向队列

单向队列只能再一边操作
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  先进先出
栈:  弹夹  先进后出
队列之间的区别:
单向队列:只能从一个方向取
双向队列:两个方向都可以取
View Code

五、迭代器和生成器

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是生成器
View Code

六、下标式循环

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
View Code

七、内置函数

基础类型模块内存函数
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)

 

posted @ 2017-03-05 20:37  pyrene  阅读(190)  评论(0编辑  收藏  举报