我寫的 Python 代碼,同事都說好

来源:https://www.cnblogs.com/alwaysbeta/archive/2022/03/23/16046919.html
-Advertisement-
Play Games

原文鏈接: 我寫的 Python 代碼,同事都說好 人生苦短,我用 Python。 程式員的追求就是不寫代碼,早日財務自由。不對,一不小心把實話說出來了,應該是將代碼寫得簡潔,優雅。 Python 程式員的追求則是 Pythonic,正好在 Python 這門語言中,「隱藏」了特別多方法,可以使代碼 ...


原文链接: 我写的 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() 对列表进行排序。它们之间的区别有两点:

  1. sort() 方法是对原列表进行操作,而 sorted() 方法会返回一个新列表,不是在原来的基础上进行操作。
  2. 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, 3, 4, 3, 4, 5, 4, 4, 2]
>>> b = max(set(a), key=a.count)
>>> b
4

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

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

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


推荐阅读:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 大部分的面試者在IT行業面試中,提及設計模式,可以列舉一大堆,但是面試官要求細說的時候,往往部分基礎不夠牢固的同學只能提及簡單工廠。今天我們來對面試過程中最常見的簡單工廠、工廠方法和抽象工廠進行一個剖析,喜歡的朋友可以點個關註哦。 正文 在面向對象的編程中,一般通過繼承和虛函數來提供抽象能力, ...
  • 外觀模式又叫門面模式,屬於結構型模式;是一種通過為多個複雜的子系統提供一個一致的介面,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一介面,外部應用程式不用關心內部子系統的具體細節,這樣會大大降低應用程式的複雜度,提高了程式的可維護性。 現在微服務和模塊化越來越流行,我們都會把一個複雜的系統 ...
  • 《零基礎學Java》 標簽組件與圖標 在Swing中顯示文本或提示信息可以使用標簽(JLabel),它可以顯示文字和圖標。 JLabel 標簽組件 標簽由 JLabel類 定義,它的父類為 JComponent類。標簽可以顯示一行只讀文本,一個圖像(它不能產生任何事件)。 JLabel類常用的構造方 ...
  • 1 項目介紹 最開始是一個單體應用,所有功能模塊都寫在一個項目里,後來覺得項目越來越大,於是決定把一些功能拆分出去,形成一個一個獨立的微服務,於是就有個問題了,登錄、退出、許可權控制這些東西怎麼辦呢?總不能每個服務都複製一套吧,最好的方式是將認證與鑒權也單獨抽離出來作為公共的服務,業務系統只專心做業務 ...
  • 非同步請求特點:某一個時刻,瀏覽器可以委托多個非同步請求對象發送請求,無需等待請求處理完成 ...
  • 泛型類:把泛型定義在類上 package Day16; //泛型類:把泛型定義在類上 public class ObjectDemo<T> { //把泛型定義在類上 調用時只能調用和添加本類型的數據 private T obj; public void setObj(T obj) { this.ob ...
  • Spring 框架是由於軟體開發的複雜性而創建的。Spring 使用的是基本的 JavaBean 來完成以前只可能由 EJB 完成的事情。 ...
  • 基本開發環境💨 Python 3.6 Pycharm 相關模塊的使用💨 import os import requests import time import re import json from docx import Document from docx.shared import Cm ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...