Python學習(八)

來源:互聯網
上載者:User
文章目錄
  • 1、列表
  • 2、元組
  • 3、字典
  • 4、序列
  • 5、集合
  • 6、引用
  • 7、更多字串的內容
  • 總結:
八、資料結構

資料結構就是可以將一些資料結合到一起的資料結構,換言之用於儲存一組相關的資料,Python有4種內建資料結構:列表,元組,字典和集合。

1、列表

列表是一種用於儲存有序元素集合的資料結構,即你可以在列表中儲存元素序列。考慮一個購物清單,上面有你需要購買的物品列表,只不過你可能希望以分號分隔他們而到Python變成了逗號。

列表元素被包含在方括弧中,這樣Python就會才會明白你指定的是一個列表。一點列表建立完畢,我們可以對其元素進行添加,刪除和搜尋。正是因為可以執行添加和刪除操作,我們將列表稱作可變類型,即這種類型可以被修改。

對象和類的快速簡介

列表是使用對象和類的一個例子。當我們對變數i賦值時,例如賦值5,這相當於建立一個Int類(類型)的對象(執行個體),你可以參看help(int)來更好的理解它。

一個類同樣可以擁有方法,即函數,而他們只能應用與這個類。並且只有當你擁有一個類的對象時才能使用這些功能。例如,Python為列表提供了一個append方法允許我們將元素添加到列表的表尾。如,mylist.append(‘an item’)將字串添加到列表mylist的尾部。注意,要用點號訪問對象方法。

一個類還可以擁有欄位,而欄位只不過是專門應用與一個類的變數而已。當你擁有對應類的對象時就能使用這些變數了。欄位同樣利用點號訪問,如,mylist.field。

例如:

# Filename: using_list.py # This is my shopping listshoplist = ['apple', 'mango', 'carrot', 'banana'] print('I have', len(shoplist), 'items to purchase.') print('These items are:', end=' ')for item in shoplist:    print(item, end=' ') print('\nI also have to buy rice.')shoplist.append('rice')print('My shopping list is now', shoplist) print('I will sort my list now')shoplist.sort()print('Sorted shopping list is', shoplist) print('The first item I will buy is', shoplist[0])olditem = shoplist[0]del shoplist[0]print('I bought the', olditem)print('My shopping list is now', shoplist)

輸出:

C:\Users\Administrator>python D:\python\using_list.py

I have 4 items to purchase.

These items are: apple mango carrot banana

I also have to buy rice.

My shopping list is now ['apple', 'mango', 'carrot', 'banana', 'rice']

I will sort my list now

Sorted shopping list is ['apple', 'banana', 'carrot', 'mango', 'rice']

The first item I will buy is apple

I bought the apple

My shopping list is now ['banana', 'carrot', 'mango', 'rice']

工作原理:

變數shoplist是某個購物人的購物清單。我們只在shoplist中儲存被購買物品的名字字串,但你也可以為列表增加任何其它種類對象,包括數字甚至是其它列表。我們通過for…in迭代列表元素,現在我們可以看到列表其實也是一個序列。

注意print的end關鍵字實參,他指定我們希望以空格結束輸出而不是通常的換行。

接下來我們使用列表對象的append方法為列表添加一個新的元素。 為了確定元素真的被添加進去了,我們簡單的將列表傳給print函數,print函數整潔的將列表內容列印出來。 隨後我們使用列表的sort方法對列表進行排序,注意sort會影響列表本身而不是返回一個被修改後的列表。這與字串的工作方式不同,這也是為什麼說類標是可變類型而字串是不可變類型的原因。 然後當在市場購買一樣東西後,我們希望將其從列表中刪除,del語句用處在此。在這裡我們指出希望刪除列表中的哪個元素,de就將這個元素從列表中刪除。我們指定的是希望刪除列表的第一個元素,因此我們使用del shoplist[0](回想一下,python的索引從0開始)。

如果你想知道list對象的所有方法,詳見help(list)。

2、元組

元組用於儲存各種各樣的對象。它與列表很相似,但它缺少列表提供的大量功能。列表的一個主要特點就象字串一樣,它是不可變類型,也就是說你不可以修改元組。

元組通過一組以逗號分隔的元素定義,並以一個可選的小括弧閉合。

元組通常用於這樣的情形,一個語句或一個使用者定義的函數能夠安全的假設其使用的一組值(即元組值)不會發生改變。

例如:

# Filename: using_tuple.py zoo = ('python', 'elephant', 'penguin') # remember the parentheses are optionalprint('Number of animals in the zoo is', len(zoo)) new_zoo = 'monkey', 'camel', zooprint('Number of cages in the new zoo is', len(new_zoo))print('All animals in new zoo are', new_zoo)print('Animals brought from old zoo are', new_zoo[2])print('Last animal brought from old zoo is', new_zoo[2][2])print('Number of animals in the new zoo is', len(new_zoo)-1+len(new_zoo[2]))

輸出:

C:\Users\Administrator>python D:\python\using_tuple.py

Number of animals in the zoo is 3

Number of cages in the new zoo is 3

All animals in new zoo are ('monkey', 'camel', ('python', 'elephant', 'penguin')

)

Animals brought from old zoo are ('python', 'elephant', 'penguin')

Last animal brought from old zoo is penguin

Number of animals in the new zoo is 5

工作原理:

變數zoo引用一個元組。我們看到len函數可以得到元組的長度。這也表明元組同樣是一個序列類型。 接著我們將這些動物轉移到一個新的動物園。因此元組new_zoo既包含已有的動物又包含從老動物園轉移過來的新動物。

注意一個包含在其它元組內的元組並不會丟失它的身份。

像列表一樣,我們可以通過一對方括弧指定元素的位置訪問這個元素。這叫做索引操作符。我們通過new_zoo[2]訪問new_zoo的第三個元素,通過new_zoo[2][2]訪問new_zoo的第三個元素的第三個元素。一但你理解這種語言風格,你會覺得這樣的操作太簡單了。

小括弧

雖然小括弧是可選的,但強烈建議你堅持使用小括弧,這樣一眼就能看出它是個元組,尤其還能避免出現歧義。

例如,print(1, 2, 3)和print((1, 2, 3))是不同的 – 前者列印3個數字而後者列印一個元組(包含3個數字)。

擁有0個或一個元素的元組

一個空元組通過空圓括弧建立,例如myempty = ()。

不過,指定一個單元素元組就不那麼直觀了。你必須在其僅有的一個元素後跟隨一個逗號,這樣python才能區分出

你要的是元組而不是一個被小括弧包圍的對象的運算式。例如你想要一個包含值為2的單元素元組,則必須寫成singleton = (2, )

注意:列表之中的列表不會失去它的身份,即列表不會像Perl中那樣被打散。同樣元組中的元組,或列表中的元組,或元組中的列表等等都是如此。只要是Python,它們就只是使用另一個Object Storage Service的對象。

3、字典

字典就像通訊錄,只要知道連絡人的名字就能找到他的地址或詳細資料。即我們將鍵(名字)與值(相關資訊)聯絡到一起。

注意:

鍵必須是唯一的,這就像如果兩個人同名你就沒法找到正確的資訊了。

字典的鍵必須是不可變對象(比如字串),但字典的值可以是可變或不可變對象。基本上這意味著只能將簡單的對象作為鍵。

字典中的索引值對使用文法d = {key1 :value1, key2: value2}指定。

注意它們的鍵/值對用冒號分割,而各個對用逗號分割,所有這些都包括在花括弧中。

記住字典中的鍵/值對是無序的。如果你希望按照特定的順序排列它們,你只能在使用前自己排序。

而你實際使用的字典是dict類的對象/執行個體。

例如:

# Filename: using_dict.py # 'ab' is short for 'a'ddress'b'ook ab = {  'Swaroop'   : 'swaroop@swaroopch.com',        'Larry'     : 'larry@wall.org',        'Matsumoto' : 'matz@ruby-lang.org',        'Spammer'   : 'spammer@hotmail.com'    } print("Swaroop's address is", ab['Swaroop']) # Deleting a key-value pairdel ab['Spammer'] print('\nThere are {0} contacts in the address-book\n'.format(len(ab))) for name, address in ab.items():    print('Contact {0} at {1}'.format(name, address)) # Adding a key-value pairab['Guido'] = 'guido@python.org' if 'Guido' in ab:    print("\nGuido's address is", ab['Guido'])

輸出:

C:\Users\Administrator>python D:\python\using_dict.py

Swaroop's address is swaroop@swaroopch.com

There are 3 contacts in the address-book

Contact Swaroop at swaroop@swaroopch.com

Contact Matsumoto at matz@ruby-lang.org

Contact Larry at larry@wall.org Guido's address is guido@python.org

工作原理:

我們使用已經介紹過的標記建立了字典ab。然後我們使用在列表和元組章節中已經討論過的索引操作符來指定鍵,從而使用鍵/值對。我們可以看到字典的文法同樣十分簡單。

我們可以使用我們的老朋友——del語句來刪除鍵/值對。我們只需要指明字典和用索引操作符指明要刪除的鍵,然後把它們傳遞給del語句就可以了。執行這個操作的時候,我們無需知道那個鍵所對應的值。

接下來,我們使用字典的items方法,來使用字典中的每個鍵/值對。這會返回一個元組的列表,其中每個元組都包含一對項目——鍵與對應的值。我們抓取這個對,然後分別賦給for..in迴圈中的變數nameaddress然後在for-塊中列印這些值。

我們可以使用索引操作符來定址一個鍵並為它賦值,這樣就增加了一個新的鍵/值對,就像在上面的例子中我們對Guido所做的一樣。

我們可以使用in操作符來檢驗一個鍵/值對是否存在,或者使用dict類的has_key方法。你可以使用help(dict)來查看dict類的完整方法列表。

關鍵字參數與字典

如果換一個角度看待你在函數中使用的關鍵字參數的話,你已經使用了字典了!只需想一下——你在函數定義的參數列表中使用的鍵/值對。當你在函數中使用變數的時候,它只不過是使用一個字典的鍵(這在編譯器設計的術語中被稱作符號表 )。

4、序列

列表、元組和字串都是序列,但是序列是什麼,它們為什麼如此特別呢?序列的兩個主要特點是索引操作符和切片操作符。索引操作符讓我們可以從序列中抓取一個特定項目。以上說到的三種序列類型 – lists,tuples,strings還支援一種切片操作,允許我們得到序列的一個切片,即序列的部分。

例如:

# Filename: seq.py shoplist = ['apple', 'mango', 'carrot', 'banana']name = 'swaroop' # Indexing or 'Subscription' operationprint('Item 0 is', shoplist[0])print('Item 1 is', shoplist[1])print('Item 2 is', shoplist[2])print('Item 3 is', shoplist[3])print('Item -1 is', shoplist[-1])print('Item -2 is', shoplist[-2])print('Character 0 is', name[0]) # Slicing on a listprint('Item 1 to 3 is', shoplist[1:3])print('Item 2 to end is', shoplist[2:])print('Item 1 to -1 is', shoplist[1:-1])print('Item start to end is', shoplist[:]) # Slicing on a stringprint('characters 1 to 3 is', name[1:3])print('characters 2 to end is', name[2:])print('characters 1 to -1 is', name[1:-1])print('characters start to end is', name[:])

輸出:

C:\Users\Administrator>python D:\python\seq.py

Item 0 is apple

Item 1 is mango

Item 2 is carrot

Item 3 is banana

Item -1 is banana

Item -2 is carrot

Character 0 is s

Item 1 to 3 is ['mango', 'carrot']

Item 2 to end is ['carrot', 'banana']

Item 1 to -1 is ['mango', 'carrot']

Item start to end is ['apple', 'mango', 'carrot', 'banana']

characters 1 to 3 is wa

characters 2 to end is aroop

characters 1 to -1 is waroo

characters start to end is swaroop

工作原理:

首先,我們來學習如何使用索引來取得序列中的單個項目。這也被稱作是下標操作。每當你用方括弧中的一個數來指定一個序列的時候,Python會為你抓取序列中對應位置的項目。記住,Python從0開始計數。因此,shoplist[0]抓取第一個項目,shoplist[3]抓取shoplist序列中的第四個元素。

索引同樣可以是負數,在那樣的情況下,位置是從序列尾開始計算的。因此,shoplist[-1]表示序列的最後一個元素而shoplist[-2]抓取序列的倒數第二個項目。

切片操作符是序列名後跟一個方括弧,方括弧中有一對可選的數字,並用冒號分割。注意這與你使用的索引操作符十分相似。記住數是可選的,而冒號是必須的。

切片操作符中的第一個數(冒號之前)表示切片開始的位置,第二個數(冒號之後)表示切片到哪裡結束。如果不指定第一個數,Python就從序列首開始。如果沒有指定第二個數,則Python會停止在序列尾。注意,返回的序列從開始位置 開始 ,剛好在 結束 位置之前結束。即開始位置是包含在序列切片中的,而結束位置被排斥在切片外。

這樣,shoplist[1:3]返回從位置1開始,包括位置2,但是停止在位置3的一個序列切片,因此返回一個含有兩個項目的切片。類似地,shoplist[:]返回整個序列的拷貝。

你可以用負數做切片。負數用在從序列尾開始計算的位置。例如,shoplist[:-1]會返回除了最後一個項目外包含所有項目的序列切片。

另外你還可以為切片提供第三個實參,它代表步長(預設為1)。

>>> shoplist = ['apple', 'mango', 'carrot', 'banana']

>>> shoplist[::1]

['apple', 'mango', 'carrot', 'banana']

>>> shoplist[::2]

['apple', 'carrot']

>>> shoplist[::3]

['apple', 'banana']

>>> shoplist[::-1]

['banana', 'carrot', 'mango', 'apple']

注意當步長為2時,我們得到索引為0,2…的元素,步長為3時得到0,3…,以此類推。

用python互動解譯器(這樣你能立即看到結果)嘗試切片的各種用法吧。

序列類型最好的地方在於你能夠以相同的方式訪問元組,列表,字串。

5、集合

集合是簡單對象的無序集合,適合當更關心集合中的元素是否存在而不是它們的順序或是它們出現的次數的時候。

使用集合,你可以測試從屬關係,是否一個集合是另一個集合的子集,或是尋找兩個集合的交集等等。

>>> bri = set(['brazil', 'russia', 'india'])

>>> 'india' in bri

True

>>> 'usa' in bri

False

>>> bric = bri.copy()

>>> bric.add('china')

>>> bric.issuperset(bri)

True

>>> bri.remove('russia')

>>> bri & bric # OR bri.intersection(bric)

{'brazil', 'india'}

工作原理:

代碼幾乎是自說明的,因為它涉及到的基礎集合論知識我們已經在學校學過了。

6、引用

當你建立一個對象並將其賦給一個變數的時候,變數只是引用了這個對象,而變數並不代表這個對象本身。換言之,變數名指向你的電腦記憶體的一部分,而這部分記憶體用於儲存實際的對象。這叫做名字到對象的綁定。

通常你不用關心這些,但你應該知道由於引用造成的一些細微的影響。

例如:

# Filename: reference.py print('Simple Assignment')shoplist = ['apple', 'mango', 'carrot', 'banana']mylist = shoplist # mylist is just another name pointing to the same object! del shoplist[0] # I purchased the first item, so I remove it from the list print('shoplist is', shoplist)print('mylist is', mylist)# notice that both shoplist and mylist both print the same list without# the 'apple' confirming that they point to the same object print('Copy by making a full slice')mylist = shoplist[:] # make a copy by doing a full slicedel mylist[0] # remove first item print('shoplist is', shoplist)print('mylist is', mylist)# notice that now the two lists are different

輸出:

C:\Users\Administrator>python D:\python\reference.py

Simple Assignment

shoplist is ['mango', 'carrot', 'banana']

mylist is ['mango', 'carrot', 'banana']

Copy by making a full slice

shoplist is ['mango', 'carrot', 'banana']

mylist is ['carrot', 'banana']

工作原理:

大多數解釋已經在程式的注釋中了。你需要記住的只是如果你想要複製一個列表或者類似的序列或者其他複雜的對象(不是如整數那樣的簡單對象),那麼你必須使用切片操作符來取得拷貝。如果你只是想要使用另一個變數名,兩個名稱都 參考 同一個對象,那麼如果你不小心的話,可能會引來各種麻煩。

註:記住列表的指派陳述式不建立拷貝。你得使用切片操作符來建立序列的拷貝。

7、更多字串的內容

我們已經在前面詳細討論了字串。我們還需要知道什麼呢?那麼,你是否知道字串也是對象,同樣具有方法。這些方法可以完成包括檢驗一部分字串和去除空格在內的各種工作。

你在程式中使用的字串都是str類的對象。這個類的一些有用的方法會在下面這個例子中說明。如果要瞭解這些方法的完整列表,請參見help(str)

例如:

# Filename: str_methods.py name = 'Swaroop' # This is a string object if name.startswith('Swa'):    print('Yes, the string starts with "Swa"') if 'a' in name:    print('Yes, it contains the string "a"') if name.find('war') != -1:    print('Yes, it contains the string "war"') delimiter = '_*_'mylist = ['Brazil', 'Russia', 'India', 'China']print(delimiter.join(mylist))

輸出:

C:\Users\Administrator>python D:\python\str_methods.py

Yes, the string starts with "Swa"

Yes, it contains the string "a"

Yes, it contains the string "war"

Brazil_*_Russia_*_India_*_China

工作原理:

在這裡我們看到了許多字串方法的用法。

startswith方法用於確定字串是否以指定的字串開頭。而in操作檢查一個字串是否是另一個字串的一部分。

find方法用來尋找給定的字串在字串中的位置,如果沒找到對應的子串則返回-1

str類還有一個簡潔的串連序列中每個字串並返回串連後的字串的方法join,其中每個字串都將以指定的字串分隔。

總結:

我們已經詳細探討了多種Python內建的資料結構。這些資料結構將是編寫程式時至關重要的部分。

現在我們已經掌握了很多Python的基本知識,我們接下來將學習如何設計和編寫一個實用的Python程式。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.