我写的 Python 代码,同事都说好

人生苦短,我用 Python。

程序员的追求就是不写代码,早日财务自由。不对,一不小心把实话说出来了,应该是将代码写得简洁,优雅。

Python 程序员的追求则是 Pythonic,正好在 Python 这门语言中,「隐藏」了特别多方法,可以使代码变得简洁,优雅,与众不同。

我在这里总结了一些常用操作,特别是关于列表和字典,分享给大家。

第一个字母大写

这个方法有点意思,无意中发现的。

>>> s = "programming is awesome"
>>> print(s.title())
Programming Is Awesome

列表合并

第一种方式:使用 +

>>> a + b
[1, 2, 3, 4, 5, 6]

第二种方式:使用 extend 关键字。

>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]

后两种方式明显更加优雅,推荐使用。需要说明的一点是,如果列表很大的话, + 会比较慢,使用 extend 更好。

列表元素去重

使用 set() 对列表元素进行去重。

>>> a = [1, 2, 3, 4, 2, 3]
>>> list(set(a))
[1, 2, 3, 4]

列表排序

使用 sort() 或内建函数 sorted() 对列表进行排序。它们之间的区别有两点:

sort()
>>> a = [1, 2, 3, 4, 2, 3]
>>> a.sort()
>>> a
[1, 2, 2, 3, 3, 4]
>>>
>>> a = [1, 2, 3, 4, 2, 3]
>>> a.sort(reverse=True)
>>> a
[4, 3, 3, 2, 2, 1]

sorted()
>>> a = [1, 2, 3, 4, 2, 3]
>>> sorted(a)
[1, 2, 2, 3, 3, 4]
>>> a = [1, 2, 3, 4, 2, 3]
>>> sorted(a, reverse=True)
[4, 3, 3, 2, 2, 1]

遍历列表的索引和元素对

使用 enumerate() 函数可以同时输出索引和元素值。

>>> a = ['python', 'go', 'java']
>>> for i, v in enumerate(a):
...     print(i, v)

output
0 python
1 go
2 java

查找列表中出现最频繁的元素

使用 max() 函数可以快速查找出一个列表中出现频率最高的某个元素。

需要说明的一点是,当列表中有两个元素出现的次数相同时,会返回第一个出现的元素。

>>> a = [1, 2]
>>> b = max(set(a), key=a.count)
>>> b
1

统计列表中所有元素的出现次数

前面的代码给出了出现最频繁的值。如果想要知道列表中所有元素的出现次数,那么可以使用 collections 模块。

collections 是 Python 中的一个宝藏模块,它提供了很多特性。 Counter 方法正好可以完美解决这个需求。

>>> from collections import Counter
>>>
>>> a = [1, 2, 3, 4, 3, 4, 5, 4, 4, 2]
>>> Counter(a)
Counter({4: 4, 2: 2, 3: 2, 1: 1, 5: 1})

将两个列表合并为字典

使用 zip() 函数,可以将两个列表合并成字典。

>>> a = ['one', 'tow', 'three']
>>> b = [1, 2, 3]
>>> dict(zip(a, b))
{'one': 1, 'tow': 2, 'three': 3}

求两个列表的交集,并集和差集

list_operate.py

def main():
    list_a = [1, 2, 3, 4, 5]
    list_b = [4, 5, 6, 7, 8]

    # 求交集的两种方式
    res_a = [i for i in list_a if i in list_b]
    res_b = list(set(list_a).intersection(set(list_b)))

    print(f"res_a is: {res_a}")
    print(f"res_b is: {res_b}")

    # 求并集
    res_c = list(set(list_a).union(set(list_b)))
    print(f"res_c is: {res_c}")

    # 求差集的两种方式,在B中但不在A中
    res_d = [i for i in list_b if i not in list_a]
    res_e = list(set(list_b).difference(set(list_a)))

    print(f"res_d is: {res_d}")
    print(f"res_e is: {res_e}")

if __name__ == '__main__':
    main()

字典创建

1、创建空字典
a = {}
b = dict()

2、有初始值,从输入的便利程度来说,我更喜欢第二种
a = {'a': 1, 'b': 2, 'c': 3}
b = dict(a=1, b=2, c=3)

3、key 来自一个列表,而 value 相同, 使用 fromkeys,那是相当的优雅
keys = ['a', 'b', 'c']
value = 100
d = dict.fromkeys(keys, value)

4、key 来自一个列表,而 value 也是一个列表,使用 zip
keys = ['a', 'b', 'c']
values = [1, 2, 3]
d = dict(zip(keys, values))

字典合并

m = {'a': 1}
n = {'b': 2, 'c': 3}

合并,两种方式
1、使用 update
m.update(n)
2、使用 **
{**m, **n}

判断 key 是否存在

在 Python2 中判断某个 key 是否存在,可以使用 has_key,但这个方法在 Python3 中已经被移除了。

另一种方法是使用 in 关键字,不仅兼容 Python2 和 Python3,速度还更快,强烈推荐。

d = {'a': 1, 'b': 2}
if 'a' in d:
    print('hello')

获取字典中的值

d = {'a': 1, 'b': 2}

1、直接用 key 取值,但这种方式不好,如果 key 不存在会报错,推荐使用 get
a = d['a']

2、使用 get,如果 key 不存在还可以赋默认值
a = d.get('a')
c = d.get('c', 3)

字典遍历

d = {'a': 1, 'b': 2, 'c': 3}

遍历 key
for key in d.keys():
    pass

遍历 value
for value in d.values():
    pass

遍历 key 和 value
for key, value in d.items():
    pass

字典推导式

列表推导式和字典推导式是我相当喜欢的功能,简洁高效。 mapfilter 我都已经快不会用了。

l = [1, 2, 3]
{n: n * n for n in l}
{1: 1, 2: 4, 3: 9}

字典按 key 或 value 排序

d = {'a': 1, 'b': 2, 'e': 9, 'c': 5, 'd': 7}

按 key 排序
sorted(d.items(), key=lambda t: t[0])
按 key 倒序
sorted(d.items(), key=lambda t: t[0], reverse=True)

按 value 排序
sorted(d.items(), key=lambda t: t[1])

还有一个需求是我在开发过程经常碰到的,就是有一个列表,列表的元素是字典,然后按字典的 value 对列表进行排序。

l = [{'name': 'a', 'count': 4}, {'name': 'b', 'count': 1}, {'name': 'd', 'count': 2}, {'name': 'c', 'count': 6}]
sorted(l, key=lambda e: e.__getitem__('count'))
倒序
sorted(l, key=lambda e: e.__getitem__('count'), reverse=True)

以上就是本文的全部内容,如果觉得还不错的话,欢迎 点赞转发关注,感谢支持。

推荐阅读:

Original: https://www.cnblogs.com/alwaysbeta/p/16046919.html
Author: yongxinz
Title: 我写的 Python 代码,同事都说好

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582730/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 用户身份标识与账号体系实践

    互联网的账号自带备忘机制; 一、业务背景 通常在系统研发的过程中,需要不断适配各种业务场景,扩展服务的领域和能力,一般会将构建的产品矩阵划分出多条业务线,以便更好的管理; 由于各个…

    Linux 2023年6月14日
    091
  • GIT使用说明

    1、Git入门教程 1.1:Git入门与使用 (一) Git介绍与安装 1.2:Git入门与使用 (二) Git相关命令的介绍与使用 1.3:Git入门与使用 (三) 使用GitH…

    Linux 2023年6月13日
    0107
  • postgresql强制删除数据库

    sql;gutter:true; SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity W…

    Linux 2023年6月8日
    088
  • RabbitMQ超详细安装教程(Linux)

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 1、简介 官网:https://www.rabbitmq.com/ RabbitMQ是一个开源的遵循AMQP协议实现的基于Erl…

    Linux 2023年5月27日
    0176
  • VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程

    前言这是《VMware 虚拟机图文安装和配置 AlmaLinux OS 8.6 教程》一文的姐妹篇教程,如果你需要阅读它,请点击这里。2020 年,CentOS 宣布:计划未来将重…

    Linux 2023年6月7日
    0227
  • [云计算]OpenStack这一篇就够了!

    OpenStack简介 OpenStack背景介绍 OpenStack应用场景 OpenStack发展历程 OpenStack架构 架构设计原则 架构全景图 核心服务组件 系统通信…

    Linux 2023年6月13日
    0235
  • 【原创】Linux虚拟化KVM-Qemu分析(七)之timer虚拟化

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    0108
  • 07-MyBatis中的动态标签

    MyBatis中的动态标签 1、if标签 if标签是为了判断传入的值是否符合某种条件,比如是否不为空 2、where标签 where标签可以用来做动态拼接查询条件,当和 if标签配…

    Linux 2023年6月7日
    0102
  • 16-ArrayList和LinkedList的区别

    1.1、作用 ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用。它们可以对元素的增删改查进行操作 对于ArrayList,它在集合的…

    Linux 2023年6月7日
    094
  • 记vs2019 The view ‘xxx’ was not found.

    版本:Visual Studio 2019 16.8.2/16.8.4.net core 3.1 1.检测是否是拼写错误2.检查.csproj为文件中是否包含有下面的content…

    Linux 2023年6月7日
    0120
  • 每周一个linux命令(nano入门级使用)

    基础环境 nano命令介绍 nano是一个字符编辑软件,类似于vi/vim,比vi/vim简单方便快捷。 安装nano 输入 nano命令,提示未找到此命令,则需要安装,否则无需安…

    Linux 2023年6月8日
    097
  • 011 Linux 打包与解压 tar

    01 压缩、打包命令有哪些? Linux上有着各种压缩、打包的工具:tar、gzip、zip、7z,而 tar 应该算是 Linux 官宣的压缩工具了。tar 的核心压缩工具其实是…

    Linux 2023年5月27日
    081
  • 利用卷积神经网络处理cifar图像分类

    这是一个图像分类的比赛CIFAR( CIFAR-10 – Object Recognition in Images ) 首先我们需要下载数据文件,地址: http://…

    Linux 2023年6月6日
    0119
  • 最小生成树-Kruskal算法

    与 Prim算法贪心选择不同,Kruskal算法采取 每次选择权值最小的边的方法,这样,在 不构成环且最后能够连接完所有边它们的权重和一定是最小的。 和之前Prim算法的图一样,便…

    Linux 2023年6月7日
    0119
  • 2021年3月-第02阶段-前端基础-移动WEB开发-移动WEB开发之_响应式布局

    移动端WEB开发之响应式布局 1.0 响应式开发原理 1.1 响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。 设备的划分情况: 小…

    Linux 2023年6月8日
    0119
  • 【证券从业】金融基础知识-第五章 债券01

    注1:后续学习并整理到第八章,全书完结后再合并成一个笔记进行源文件分享 注2:本章内容巨多,大约分为两篇文章记录消化 posted @2022-06-08 01:30 陈景中 阅读…

    Linux 2023年6月13日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球