Python3 列表

来源:http://www.cnblogs.com/284628487a/archive/2016/06/15/5584902.html
-Advertisement-
Play Games

list是一種有序的集合,可以隨時添加和刪除其中的元素。 >>> classmates = ['Michael', 'Bob', 'Tracy'] >>> classmates ['Michael', 'Bob', 'Tracy'] 獲取 >>> classmates[2] 'Tracy' 當索引超 ...


list是一種有序的集合,可以隨時添加和刪除其中的元素。
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']

獲取

>>> classmates[2]
'Tracy'

當索引超出了範圍時,Python會報一個IndexError錯誤,所以,要確保索引不要越界,記得最後一個元素的索引是len(classmates) - 1

如果要取最後一個元素,除了計算索引位置外,還可以用-1做索引,直接獲取最後一個元素:

以此類推,可以獲取倒數第2個、倒數第3個:friends[-1],friends[-2] list是一個可變的有序表,所以,可以往list中追加元素到末尾:
friends.append("zx")
friends.insert(0, "yyn")
friends.pop() // 刪除最後一個元素
friends.pop(1) // 刪除索引1對應的元素
friends[0] = "hh" // 直接對索引0賦值

list裡面的元素的數據類型也可以不同,比如:

>>> L = ['Apple', 123, True]

list元素也可以是另一個list,比如:

>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
要拿到'php'可以寫s[2][1]

tuple

另一種有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改,比如同樣是列出同學的名字

>>> classmates = ('Michael', 'Bob', 'Tracy')
現在,classmates這個tuple不能變了,它也沒有append(),insert()這樣的方法。其他獲取元素的方法和list是一樣的,你可以正常地使用classmates[0]classmates[-1],但不能賦值成另外的元素。

不可變的tuple有什麼意義?因為tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就儘量用tuple。

tuple的陷阱:當你定義一個tuple時,在定義的時候,tuple的元素就必須被確定下來。

如果要定義一個空的tuple,可以寫成()

但是,要定義一個只有1個元素的tuple,如果你這麼定義:

>>> t = (1)
>>> t
1
定義的不是tuple,是1這個數!這是因為括弧()既可以表示tuple,又可以表示數學公式中的小括弧,這就產生了歧義,因此,Python規定,這種情況下,按小括弧進行計算,計算結果自然是1

所以,只有1個元素的tuple定義時必須加一個逗號,,來消除歧義:

>>> t = (1,)
>>> t
(1,)

Python在顯示只有1個元素的tuple時,也會加一個逗號,,以免你誤解成數學計算意義上的括弧。

最後來看一個“可變的”tuple:

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

這個tuple定義的時候有3個元素,分別是'a''b'和一個list

錶面上看,tuple的元素確實變了,但其實變的不是tuple的元素,而是list的元素。tuple一開始指向的list並沒有改成別的list,所以,tuple所謂的“不變”是說,tuple的每個元素,指向永遠不變。即指向'a',就不能改成指向'b',指向一個list,就不能改成指向其他對象,但指向的這個list本身是可變的!  

條件判斷

if判斷條件還可以簡寫,比如寫:

if x:
    print('True')
else:
   print('False');

只要x是非零數值、非空字元串、非空list等,就判斷為True

if <條件判斷1>:
    <執行1>
elif <條件判斷2>:
    <執行2>
elif <條件判斷3>:
    <執行3>
else:
    <執行4>
  input()返回的數據類型是str,Python提供了int()函數來進行數據轉換。

迴圈

Python的迴圈有兩種,一種是for...in迴圈,依次把list或tuple中的每個元素迭代出來,看例子:

names = ['Michael', 'Bob', 'Tracy']
for name in names:
    print(name)
計算1-10的和
sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
    sum = sum + x
print(sum)
Python提供一個range()函數,可以生成一個整數序列,再通過list()函數可以轉換為list。比如range(5)生成的序列是從0開始小於5的整數:
>>> list(range(5))
[0, 1, 2, 3, 4]
sum = 0
for x in range(101):
    sum = sum + x
print(sum)
第二種迴圈是while迴圈,只要條件滿足,就不斷迴圈,條件不滿足時退出迴圈。比如我們要計算100以內所有奇數之和,可以用while迴圈實現:
sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)

dict

Python內置了字典:dict的支持,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)存儲,具有極快的查找速度。

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d['Michael'] 95

為什麼dict查找速度這麼快?因為dict的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往後翻,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法,list越大,查找越慢。

第二種方法是先在字典的索引表裡(比如部首表)查這個字對應的頁碼,然後直接翻到該頁,找到這個字。無論找哪個字,這種查找速度都非常快,不會隨著字典大小的增加而變慢。

dict就是第二種實現方式,給定一個名字,比如'Michael',dict在內部就可以直接計算出Michael對應的存放成績的“頁碼”,也就是95這個數字存放的記憶體地址,直接取出來,所以速度非常快。

你可以猜到,這種key-value存儲方式,在放進去的時候,必鬚根據key算出value的存放位置,這樣,取的時候才能根據key直接拿到value。

把數據放入dict的方法,除了初始化時指定外,還可以通過key放入:

>>> d['Adam'] = 67
>>> d['Adam']
67

由於一個key只能對應一個value,所以,多次對一個key放入value,後面的值會把前面的值衝掉,如果key不存在,dict就會報錯:

要避免key不存在的錯誤,有兩種辦法,一是通過in判斷key是否存在:
>>> 'Thomas' in d
False
二是通過dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
要刪除一個key,用pop(key)方法,對應的value也會從dict中刪除: 務必註意,dict內部存放的順序和key放入的順序是沒有關係的。

和list比較,dict有以下幾個特點:

  1. 查找和插入的速度極快,不會隨著key的增加而增加;
  2. 需要占用大量的記憶體,記憶體浪費多。

而list相反:

  1. 查找和插入的時間隨著元素的增加而增加;
  2. 占用空間小,浪費記憶體很少。

所以,dict是用空間來換取時間的一種方法。

dict可以用在需要高速查找的很多地方,在Python代碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象

這是因為dict根據key來計算value的存儲位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的演算法稱為哈希演算法(Hash)

set

set和dict類似,也是一組key的集合,但不存儲value。由於key不能重覆,所以,在set中,沒有重覆的key。

要創建一個set,需要提供一個list作為輸入集合:

>>> s = set([1, 2, 3])
重覆元素在set中自動被過濾:s = set([1, 2, 3, 3]) # s = (1, 2, 3)
通過add(key)方法可以添加元素到set中,可以重覆添加,但不會有效果 通過remove(key)方法可以刪除元素
>>> s.remove(4)
set可以看成數學意義上的無序和無重覆元素的集合,因此,兩個set可以做數學意義上的交集、並集等操作:
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
set和dict的唯一區別僅在於沒有存儲對應的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變對象,因為無法判斷兩個可變對象是否相等,也就無法保證set內部“不會有重覆元素”。試試把list放入set,看看是否會報錯。 

不可變對象

上面我們講了,str是不變對象,而list是可變對象。

對於可變對象,比如list,對list進行操作,list內部的內容是會變化的

>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']

而對於不可變對象,比如str,對str進行操作呢:

>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc' # replace方法創建了一個新字元串'Abc'並返回
>>> a
'abc'
要始終牢記的是,a是變數,而'abc'才是字元串對象!有些時候,我們經常說,對象a的內容是'abc',但其實是指,a本身是一個變數,它指向的對象的內容才是'abc': 所以,對於不變對象來說,調用對象自身的任意方法,也不會改變該對象自身的內容。相反,這些方法會創建新的對象並返回,這樣,就保證了不可變對象本身永遠是不可變的。  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Code First 遷移可用於從 Visual Studio 內部更新資料庫,但也可通過命令行工具 migrate.exe 來執行。本頁簡單介紹如何使用 migrate.exe 對資料庫執行遷移。 複製 migrate.exe 在使用 NuGet 安裝實體框架時,migrate.exe 位於下載包 ...
  • WCF Data Service with OData 是一個優秀的Restful Web Service在ASP.NET下的實現,但是在使用中,我遇到了一個問題,即當我單獨部署WDS服務的時候,Ajax訪問就需要跨域。 在一般的WCF服務中,我們可以用JSONP解決。所以我發起了下麵這個請求: 你 ...
  • 在uwp開發中必不可少的一個環節就是各種通用的控制項的開發,所以在閑暇時間彙總了一下在uwp開發中控制項的幾種常用寫法,以及屬性的幾種綁定方式,有可能不全面,請大家多多包涵 :) 1、先從win10新增的{x:Bind}綁定方式說起,相對於{Binding},{x:Bind}在時間複雜度和空間複雜度上都 ...
  • Java程式設計語言提供兩種機制,可以用來定義允許多個實現的類型:介面和抽象方法,這兩者直接醉為明顯的區別在於,抽象類允許某些方法的實現,但介面不允許,一個更為重要的區別在於,為了實現由抽象類定義的類型,類必須成為抽象類的一個子類。任何一個類,只要定義了所有必要的方法,並且遵守通用約定,它就被允許實 ...
  • #coding= gbk s = '谷歌' print s 輸出結果:谷歌 方法二: 在輸出時進行轉碼: #coding= utf-8 s = '谷歌' print unicode(s,'gbk') 輸出結果:谷歌 ...
  • 1、++i 的用法(以 a=++i ,i=2 為例) 先將 i 值加 1 (也就是 i=i+1 ),然後賦給變數 a (也就是 a=i ), 則最終 a 值等於 3 , i 值等於 3 。 所以 a=++i 相當於 i=i+1 ,a=i2、i++ 的用法(以 a=i++ ,i=2 為例) 先將 i ...
  • 10種排序演算法總結 排序演算法有很多,所以在特定情景中使用哪一種演算法很重要。為了選擇合適的演算法,可以按照建議的順序考慮以下標準: (1)執行時間 (2)存儲空間 (3)編程工作 對於數據量較小的情形,(1)(2)差別不大,主要考慮(3);而對於數據量大的,(1)為首要。 主要排序法有: 一、冒泡(Bu ...
  • 一、標識符和關鍵字 關鍵字: 就是被java語言賦予了特殊含義的單詞。 特點就是所有的關鍵字都是小寫。 標識符: 就是給包、類、介面、方法、變數名起的名字。 規則:1.以數字、字母、_以及$符號組成。 2,不能以數字開頭,不能以空格分開,不能是JAVA中的關鍵字,區別大小寫如Test 和test是2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...