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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...