iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python3 CookBook |
  • 864
分享到

Python3 CookBook |

CookBook 2023-01-31 08:01:06 864人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

文章首发于知乎专栏,欢迎关注。https://zhuanlan.zhihu.com/py... 以下测试代码全部基于 python3 1、查找最大或最小的 N 个元素 工作中有时会遇到这样的需求,取出数据中前面 10% 的值,或者最后 1

文章首发于知乎专栏,欢迎关注。
https://zhuanlan.zhihu.com/py...

以下测试代码全部基于 python3

1、查找最大或最小的 N 个元素

工作中有时会遇到这样的需求,取出数据中前面 10% 的值,或者最后 10% 的值。

我们可以先对这个列表进行排序,然后再进行切片操作,很轻松的解决这个问题。但是,有没有更好的方法呢?

heapq 模块有两个函数 nlargest() 和 nsmallest() 可以完美解决这个问题。

In [50]: import heapq

In [51]: n = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2, 23, 45, 76]

In [52]: heapq.nlargest(3, n)
Out[52]: [76, 45, 42]

In [53]: heapq.nsmallest(3, n)
Out[53]: [-4, 1, 2]

如果是取排在前面的 10% 应该怎么做?

heapq.nlargest(round(len(n)/10), n)

而且,使用这两个函数还会有更好的性能,因为在底层实现里面,会先把数据进行堆排序后放入一个列表中,然后再进行后续操作。大家如果对堆数据结构感兴趣的话,可以继续进行深入研究,由于我了解的并不深,也没办法再展开了。

但是也并不是什么时候都是这两个函数效果更好,比如只取一个最大值或者最小值,那还是 min() 或 max() 效果更好;如果要查找的元素个数已经跟集合元素个数接近时,那还是用 sorted(items)[:N] 更好,具体情况具体分析吧。

2、序列中出现次数最多的元素

以前碰到这类问题时,我都会手动创建一个字典,然后以列表中元素作为 key,进而统计出 key 出现的次数,再进行比较得到出现次数最多的元素。

殊不知 collections 中就有专门为这类问题设计的类 Counter,瞬间感觉自己蠢爆了,话不多说,直接上代码。

In [54]: from collections import Counter

In [55]: w = ['a', 'b', 'c', 'd', 'a', 'a', 'b']

In [56]: w_count = Counter(w)

In [57]: w_count
Out[57]: Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})

In [58]: w_count['a']
Out[58]: 3

In [59]: top = w_count.most_common(2)

In [60]: top
Out[60]: [('a', 3), ('b', 2)]

可以看到,Counter 返回的就是一个字典,想知道哪个元素出现几次,直接取,是不是很方便?

而且还有 most_common 函数,简直不要太棒。

3、过滤序列元素

有一个列表,如下:

In [61]: a = [1, 2, 3, 4, 5, -3]

要求过滤所有负数。需要新建一个列表?直接一行代码搞定。

In [64]: [n for n in a if n > 0]
Out[64]: [1, 2, 3, 4, 5]

如果要把负数替换成 0 呢?

In [67]: [n if n > 0 else 0 for n in a]
Out[67]: [1, 2, 3, 4, 5, 0]

但是有时候过滤条件可能比较复杂,这时就需要借助于 filter() 函数了。

values = ['1', '2', '-3', '-', '4', 'N/A', '5']
def is_int(val):
  try:
    x = int(val)
      return True
  except ValueError:
    return False

ivals = list(filter(is_int, values))
print(ivals)
# Outputs ['1', '2', '-3', '4', '5']

4、通过某个关键字将记录分组

有下面这个字典:

rows = [
  {'address': '5412 N CLARK', 'date': '07/01/2012'},
  {'address': '5148 N CLARK', 'date': '07/04/2012'},
  {'address': '5800 E 58TH', 'date': '07/02/2012'},
  {'address': '2122 N CLARK', 'date': '07/03/2012'},
  {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
  {'address': '1060 W ADDISON', 'date': '07/02/2012'},
  {'address': '4801 N BROADWAY', 'date': '07/01/2012'},
  {'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]

那么怎么对这个字典按照 date 进行分组呢?借助于 itertools.groupby() 函数可以解决这个问题,代码如下:

# Sort by the desired field first
rows.sort(key=itemgetter('date'))
# Iterate in groups
for date, items in groupby(rows, key=itemgetter('date')):
  print(date)
  for i in items:
    print(' ', i)

输出结果如下:

07/01/2012
  {'address': '5412 N CLARK', 'date': '07/01/2012'}
  {'address': '4801 N BROADWAY', 'date': '07/01/2012'}
07/02/2012
  {'address': '5800 E 58TH', 'date': '07/02/2012'}
  {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'}
  {'address': '1060 W ADDISON', 'date': '07/02/2012'}
07/03/2012
  {'address': '2122 N CLARK', 'date': '07/03/2012'}
07/04/2012
  {'address': '5148 N CLARK', 'date': '07/04/2012'}
  {'address': '1039 W GRANVILLE', 'date': '07/04/2012'}

需要注意的是,groupby() 函数仅仅检查连续相同的元素,所以在分组之前,一定要先对数据,按照分组字段进行排序。如果没有排序,便得不到想要的结果。

5、映射名称到序列元素

我常常有这样的苦恼,就是有一个列表,然后通过下标来取值,取值时很认真的数所需要元素在第几个,很怕取错值。取到值后开始下面的运算。

一段时间之后,再看这段代码,感觉很陌生,已经忘了带下标的值是什么了,还需要重新看一下这个列表的由来,才找到回忆。

如果能有一个名称映射到元素上就好了,直接通过名称就可以知道元素的含义。collections.namedtuple() 函数就可以解决这个问题。

In [76]: from collections import namedtuple

In [77]: subscriber = namedtuple('Subscriber', ['addr', 'joined'])

In [78]: sub = subscriber('jonesy@example.com', '2012-10-19')

In [79]: sub
Out[79]: Subscriber(addr='jonesy@example.com', joined='2012-10-19')

In [80]: sub.addr
Out[80]: 'jonesy@example.com'

In [81]: sub.joined
Out[81]: '2012-10-19'

这样就可以通过名称来取值了,代码可读性也更高。

需要注意的是,这种命名元祖的方式不能直接修改其中的值,直接修改会报错

In [82]: a = namedtuple('SSS', ['name', 'shares', 'price'])

In [83]: _a = a('yongxinz', 1, 2)

In [84]: _a.shares = 4
-----------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-84-f62a5288a29a> in <module>()
> 1 _a.shares = 4

AttributeError: can't set attribute

想要修改的话可以使用 _replace() 函数。

In [85]: _a._replace(shares=4)
Out[85]: SSS(name='yongxinz', shares=4, price=2)

但是还有一个疑问,如果这个列表元素比较多的话,那就需要定义很多的名称,也比较麻烦,还有更好的方式吗?

未完待续。。。

欢迎留言,或添加我个人微信 zhangyx6a 交流,不是微商。

--结束END--

本文标题: Python3 CookBook |

本文链接: https://www.lsjlt.com/news/193377.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python3 cookbook
    使用deque(maxlen=N)构造函数会新建一个固定大小的队列.当新的元素加入并且这个队列已满的时候,最老的元素会被移除掉.在队列两端插入或者删除元素时间复杂度都是O(1), 而在列表的开头插入或删除元素的时间复杂度为O(N).当要查找...
    99+
    2023-01-31
    cookbook
  • Python3 CookBook |
    文章首发于知乎专栏,欢迎关注。https://zhuanlan.zhihu.com/py... 以下测试代码全部基于 Python3 1、查找最大或最小的 N 个元素 工作中有时会遇到这样的需求,取出数据中前面 10% 的值,或者最后 1...
    99+
    2023-01-31
    CookBook
  • 最新的python3-cookbook
    链接: http://python3-cookbook.readthedocs.io/zh_CN/latest/index.html ...
    99+
    2023-01-31
    最新 cookbook
  • python之cookbook-day0
    第一章:数据结构和算法 1.2 解压可迭代对象赋值给多个变量 问题: 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError 。那么 怎样才能从这个可迭代对象中解压出 N 个元素出来? 解决方案: Python 的星...
    99+
    2023-01-30
    python cookbook
  • FLEX 3 COOKBOOK
    FLEX 3 COOK BOOK ,等了好长时间,,哈哈!先下载了看看。有需要的朋友请到[url]http://www.riabook.cn/en_book/flex-3-cookbook.htm[/url]  下载。...
    99+
    2023-01-31
    FLEX COOKBOOK
  • python cookbook 3 翻译
    自己买了个影印版,边翻边看边实践以期增强学习效果。计划是每日一个小片段,希望能坚持到底。P.S 翻得不好,请轻拍。。1 数据结构与算法1.1 将一个序列分离转换成多个变量问题:    如果你有一个由N个元素组成的元组或序列并想将其分离成多个...
    99+
    2023-01-31
    python cookbook
  • python CookBook 3 1.
    问题:    你需要从一个可迭代对象中拆解出N个元素,但是它可能多于N个元素并导致抛出“too many values to unpack”的异常解决:    python的“带星参数”可以搞定这个问题。比如说,你开了一门课并且决定在期末的...
    99+
    2023-01-31
    python CookBook
  • [NCTF2019]True XML cookbook
    小记 早前做过该题目的复现,但没有成功吧。 读文件测试 DOCTYPE creds []>&wolffy;testtest 读网络连接 /etc/hosts 储存域名解析的缓存/proc/net/ar...
    99+
    2023-09-13
    xml python php
  • Java反射经典实例 Java Reflection Cookbook
    http://www.duduwolf.com/wiki/2006/85.html[@more@]import java.lang.reflect.Array;import java.lang.reflect.Constructor;imp...
    99+
    2023-06-03
  • Python3教程——5、Python3
            一、Pycharm常用快捷键 有颜色的为很常用,或不易发现   编辑类: Ctrl + Space 基本的代码完成(类、方法、属性) Ctrl + Alt + Space 类名完成 Ctrl + Shift + Ent...
    99+
    2023-01-31
    教程
  • python3 __name__
    我们经常会在各种代码中见到一个__name__ == '__main__', 这究竟是什么意思呢 当一个python文件是被当做一个脚本运行的时候, 它的__name__就为__main__, 比如以下代码 >>>...
    99+
    2023-01-31
  • Python3 isinstance()
    描述 isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。 isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系。 isinstance(...
    99+
    2023-01-31
    isinstance
  • python3 GUI
    用python3创建窗口并显示 修改窗口的名字 在窗口中加入标签 在窗口中加入按钮 使按钮有实际意义 添加可编辑文本框 用Tkinter实现一个简单的GUI程序,单击click按钮时会在终端打印出’hello world’...
    99+
    2023-01-31
    GUI
  • Python3 urllib.parse
    1、获取url参数。>>> from urllib import parse >>> url = r'https://docs.python.org/3.5/search.htmlq=parse&...
    99+
    2023-01-31
    urllib parse
  • Python3 urllib.reque
    urllib.request库 是 Python3 自带的模块(不需要下载,导入即可使用)python 自带的模块库文件都是在C:\Python\Lib目录下(C:\Python是我Python的安装目录),python第三方模块库都是在C...
    99+
    2023-01-31
    urllib reque
  • python3- global
    ''' global函数的使用 ''' # 全局定义一个参数a global a a=4 # 给a赋值a=3 def inita(): # 全局定义一个参数a global a a=3 inita()...
    99+
    2023-01-31
    global
  • python3-socketserver
    目录 socketserver模块 基于TCP链接的简单并发程序 基于UDP无链接的简单并发程序 错误笔记: ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。 Co...
    99+
    2023-01-31
    socketserver
  • Python3 类
    目录 Python3 类 继承 项目组织方式 类编码风格 在Python中,首字母大写的名称值得是类,而小写的名称指的是根据类创建的实例。 Python类中的每个属性都必须有初始值。可以在__init__()方法内为某个属性设置默认初始...
    99+
    2023-01-31
  • python3 asyncio
    asyncio 是用来编写 并发 代码的库,使用 async/await 语法。asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等...
    99+
    2023-01-31
    asyncio
  • Python3 django2.0
    以下设置,适用于python3.5及以前的 pip install pycrypto import base64 from Crypto.Cipher import AES from Crypto import Random B...
    99+
    2023-01-31
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作