练习题

元素分类

有如下值集合[11,22,33,44,55,66,77,88,99]将所有大于66的数作为一个列表放在字典的key为k1的value小于等于66的为k2的value

{'k1':[77,88,99],'k2':[11,22,33,44,55,66]}

脚本vim day3-1

#!/usr/bin/python
# -*- coding:utf-8 -*-
number_list = [11,22,33,44,55,66,77,88,99]
number_dict = {'k1':[],'k2':[]}
for i in number_list:
  if i<66:
    number_dict['k1'].append(i)
  else:
    number_dict['k2'].append(i)
print number_dict

执行

以上是针对知道key的假如不清楚key或者是key需要在一个文件中读取呢

修改代码

#!/usr/bin/python
# -*- coding:utf-8 -*-
number_list = [11,22,33,44,55,66,77,88,99]
#number_dict = {'k1':[],'k2':[]}
number_dict = {}
for i in number_list:
  if i<66:
    if "k1" in number_dict.keys():
      number_dict['k1'].append(i)
  else:
    number_dict['k1']=[i,]
else:
  if "k2" in number_dict.keys():
    number_dict['k2'].append(i)
  else:
    number_dict['k2']=[i,]
print number_dict

先把字典定义为空,然后在第一次的时候增加key,运行结果是一样的

假如需要读取文件

log内容为

alex|123|1
eric|123|1
tony|123|1

编辑脚本day3-2.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
obj = file('log','r')
line_list = obj.readlines()
#line_list=['alex|123|1\n', 'eric|123|1\n', 'tony|123|1\n']
obj.close()
dic = {}
for line in line_list:
  line = line.strip()
#line=['alex|123|1']
  ele_list = line.split('|')
#ele_list=['alex','123','1']
  dic[ele_list[0]] = ele_list[1:]
print dic

执行

collection系列(对字典的补充)

1,计数器

>>> c1 = collections.Counter('asjdhadhwjke')
>>> c1
Counter({'a': 2, 'd': 2, 'h': 2, 'j': 2, 'e': 1, 'k': 1, 's': 1, 'w': 1})

传递一个序列计算出字符出现的次数

>>> c1 = collections.Counter('aabc')
>>> c1
Counter({'a': 2, 'c': 1, 'b': 1})
>>> c2 = collections.Counter('aab')
>>> c1.update(c2)
>>> c1
Counter({'a': 4, 'b': 2, 'c': 1})

更新了重复叠加

>>> c1['a']

4

>>> c1['o']
0

对于不存在的返回0

>>> c1.most_common(1)
[('a', 3)]
>>> c1.most_common(2)
[('a', 3), ('j', 3)]
>>> c1.most_common(3)
[('a', 3), ('j', 3), ('d', 2)]
>>> c1.most_common(4)
[('a', 3), ('j', 3), ('d', 2), ('k', 2)]
>>> c1.most_common(5)
[('a', 3), ('j', 3), ('d', 2), ('k', 2), ('l', 1)]
>>> c1.most_common(6)
[('a', 3), ('j', 3), ('d', 2), ('k', 2), ('l', 1), ('s', 1)]
>>> c1.most_common(7)
[('a', 3), ('j', 3), ('d', 2), ('k', 2), ('l', 1), ('s', 1)]

显示前几个,如果大于最大的则显示全部

>>> c1.elements()
<itertools.chain object at 0x7f003cc7fc10>
>>> for item in c1.elements():
... print item
...
a
a
a
d
d
k
k
j
j
j
l
s

取出里面所有元素,需要使用循环才能全部取出

>>> li = [11,22,33,44,55,11,44,55]
>>> c1 = collections.Counter(li)
>>> c1
Counter({11: 2, 44: 2, 55: 2, 33: 1, 22: 1})

也可以统计列表(元祖)里面的元素出现的次数

PS:Counter其实可以理解为一个内部的循环记录到字典里面

2,有序字典

对字典的补充,他记录了字典添加是顺序

>>> o1 = collections.OrderedDict()
>>> o1
OrderedDict()

和字典是一样的不同的是有序,其实是在内部维护了一个有序的列表

3,默认字典

字典的value设置一个默认的类型,可以是str,list,dict等

my_dict = collections.defaultdict(list)

PS:使用默认字典可以使用一下简单代码就能实现脚本day3-2.py的功能

4,可命名元祖

.创建类

 .使用类创建对象

.使用对象

>>> old = (1,2)
>>> old
(1, 2)

Mytuple = collections.namedtuple('Mytuple',['x','y'])

n = Mytuple(1,2)
>>> n
Mytuple(x=1, y=2)

>>> n.x
1
>>> n.y
2

PS:元祖是通过下标来访问,这个可以通过命名访问,用的最多的是用来定义坐标

5,双向队列(deque)

可以两头取数据及插入数据

线程安全

>>> q=collections.deque()
>>> q.append(1)
>>> q.append(11)
>>> q.append(13)
>>> q.append(12)
>>> q
deque([1, 11, 13, 12])
>>> q.pop()
12
>>> q
deque([1, 11, 13])

6,单向队列

只能是从一端操作(生产者消费者模型)

>>> q = Queue.Queue(10)
>>> q
<Queue.Queue instance at 0x7f773fa79368>
>>> type(q)
<type 'instance'>
>>> q.put(1)
>>> q.put(2)
>>> q.put(3)
>>> q
<Queue.Queue instance at 0x7f773fa79368>
>>> q.get()
1
>>> q.get()
2
>>> q.get()
3
>>> q.get()

一个个使用put放入使用get取出,先进先出

队列,FIFO先进先出

栈,弹夹,后进的先出

迭代器和生成器

迭代器是通过循环按顺序返回值

>>> import collections
>>> c1 = collections.Counter('1112312312sdfsdf')
>>> c1
Counter({'1': 5, '2': 3, 'd': 2, 'f': 2, 's': 2, '3': 2})
>>> c1.elements()
<itertools.chain object at 0x7fba6cdc2d10>
>>> d1=c1.elements()
>>> d1
<itertools.chain object at 0x7fba6cdae910>

直接是无法取值的只能通过循环方式取出

>>> for i in d1:
... print i
...
d
d
f
f
s
s
1
1
1
1
1
3
3
2
2
2

要实现迭代类里面要有某一个方法(next)

生成器

range()不是生成器xrange是生成器

readlines()不是生成器xreadlines()是生成器

>>> a=range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b=xrange(10)
>>> b
xrange(10)
>>> type(a)
<type 'list'>
>>> type(b)
<type 'xrange'>

>>> for i in a:
...    print i
...
0
1
2
3
4
5
6
7
8
9
>>> for i in b:
...    print i
...
0
1
2
3
4
5
6
7
8
9

range()是直接在内存创建xrange()是在使用是时候才创建

下标循环

>>> li = [11,22,33,44,55,66]
>>> for i in li:
...    print i
...
11
22
33
44
55
66

也可以通过下标实现循环,效果是一样的

>>> for i in range(len(li)):
...    print li[i]

练习

li = [13,22,6,99,11]

怎么通过循环使列表数组按从小到大排序

li = [13,22,6,99,11]
  for m in range(len(li)-1):
    if li[m] > li[m+1]:
    temp = li[m]
    li[m] = li[m+1]
    li[m+1] = temp
print li

[13, 6, 22, 11, 99]

循环一次99放到最后了

再循环一次,22就放到倒数第二位了 这就叫冒泡算法(下周继续讲)

Python之collections序列迭代器下标式循环冒泡算法等的更多相关文章

  1. 吴裕雄 python 机器学习——半监督学习标准迭代式标记传播算法LabelPropagation模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import metrics from sklearn import d ...

  2. 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON

    关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...

  3. 『无为则无心』Python序列 — 24、Python序列的推导式

    目录 1.列表推导式 (1)快速体验 (2)带if的列表推导式 (3)多个for循环实现列表推导式 2.字典推导式 (1)创建一个字典 (2)将两个列表合并为一个字典 (3)提取字典中目标数据 3.集 ...

  4. python 迭代器链式处理数据

    pytorch.utils.data可兼容迭代数据训练处理,在dataloader中使用提高训练效率:借助迭代器避免内存溢出不足的现象.借助链式处理使得数据读取利用更高效(可类比操作系统的资源调控) ...

  5. python之 可迭代 迭代器 生成器

    0. 1.总结 (1) (a)iterable 可迭代(对象) 能力属性 指一个对象能够一次返回它的一个成员,for i in a_list 而不需要通过下标完成迭代. 例子包括所有序列类型(list ...

  6. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  7. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

  8. Python数据类型之“序列概述与基本序列类型(Basic Sequences)”

    序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要以下几种类型: 3种基本序列类型(Basic Sequence Types):list. ...

  9. Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块

    Python第五天   文件访问    for循环访问文件    while循环访问文件   字符串的startswith函数和split函数  linecache模块 目录 Pycharm使用技巧( ...

随机推荐

  1. windows系统下安装composer

    使用安装程序安装 这是将 Composer 安装在你机器上的最简单的方法. 下载并且运行 Composer-Setup.exe,它将安装最新版本的 Composer 安装完成后,将composer的b ...

  2. java学习笔记----运算符

    一.算数运算符 特别说明: 加 ,减 ,乘 ,除 与数学运算一致 取余符号看被除数 自加(减)运算:++a,--a;先做自加(自减)运算在做其他运算 a++,a--;先做其他运算在做自加(自减)运算 ...

  3. vue简易轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Spring定时任务解决博客缓存数据更新问题

    最近在做博客系统的时候,由于很多页面都有右边侧边栏,内容包括博客分类信息,归档日志,热门文章,标签列表等,为了不想每次访问页面都去查询数据库,因为本身这些东西相对来说是比较固定的,但是也有可能在网站后 ...

  5. webots自学笔记(六)实用控制器函数补充

    原创文章,来自"博客园,_阿龙clliu" http://www.cnblogs.com/clliu/,转载请注明原文章出处.       用Webots软件做机器人仿真时,可以编 ...

  6. 【C#】组件分享:FormDragger-窗体拖拽器

    适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...

  7. 20155304 2016-2017-2 《Java程序设计》第六周学习总结

    20155304 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 串流设计的概念 无论来源和目的地实体形式是什么,只要取得InputStream和Ou ...

  8. (转)POPTEST联合创始人李爱然的“IT培训创业的随想"

    IT教育行业最大的问题是缺少像互联网行业一样的产品经理. 大多数IT教育机构在早期依靠个人或者一套课程开创了一定的局面,随着机构的壮大,机构把市场营销提到至高点,销售至上,而把产品(培训产品)放在后面 ...

  9. Myeclipse8.5开发-安装一:Myeclipse8.5注册码生成程序

    环境:Myeclipces8.5 1.安装Myeclipces8.5. 2.打开Myeclipces新建任意项目. 3.新建MyEclipseKeyGen.java类.点击运行,控制台输入您的注册名, ...

  10. [转]centos7环境安装rabbitMQ

    使用专业的消息队列产品rabbitmq之centos7环境安装 http://www.cnblogs.com/huangxincheng/p/6006569.html CentOS7上安装Rabbit ...