python (第二章)數據結構

文章目錄

    • 2.5 對序列使用 +和 ×
      • 建立由列表組成的列表
    • 2.6序列的增量賦值(+=和×=)
      • 關于 +=的謎題
        • 補充:extend()方法和+有什么區別呢?
    • 2.7 list.sort方法和內置函數sorted(排序)
    • 2.8 用bisect來管理已排序的序列
      • 2.8.2用bisect.insort插入元素
    • 2.9 當列表不是首選時
      • 2.9.1 數組
      • 2.9.2內存視圖
      • 2.9.3 NumPy和SciPy
      • 2.9.4 雙向隊列和其他的形式的隊列

2.5 對序列使用 +和 ×

l = [1,2,3]
print(id(l))
t= l*5
print(id(t))

結果如圖:

在這里插入圖片描述

  • 總結:+ 和 * 都遵循這個規律,不修改原有的操作對象,而是構建一個全新的序列。
  • 注意:如果a*n 這個語句中,序列a里面的元素是對其他可變對象的引用的話,這個結果可能會出乎意料。比如,你想用my_list = [[]]*3 來初始化一個由列表組成的列表,但是你得到的列表里面包含的3個元素其實是3個引用,而且這3個引用指向同一個列表。這顯然不是想要的。

建立由列表組成的列表

正確的方式1:

board = [['_'] * 3 for i in range(3)]
print(board)
board[1][2] = 'X'
print(board)

結果如圖:
在這里插入圖片描述

錯誤的方式1:含有3個指向同一對象的引用的列表是毫無用處的。

weird_board = [['_']*3] *3
print(weird_board)
weird_board[1][2] = '0'
print(weird_board)

結果如圖:
在這里插入圖片描述

錯誤的方式2:
這個和上一個錯誤的本質是一樣的

row = [' _ ']*3
board = []
for i in range(3):board.append(row)
print(board)
board[1][2] ='0'
print(board)

結果如圖:
在這里插入圖片描述
正確的方式2:
這里的等同于正確的方式1

board = []
for i in range(3):row = ['_']*3 # 每次迭代中都新建了一個列表,作為新的一行添加到boardboard.append(row)
print(board)
board[1][2] ='0'
print(board)

結果如圖:
在這里插入圖片描述

2.6序列的增量賦值(+=和×=)

增量賦值運算符+=和*=的表現取決于它們的第一個操作對象,本次的就集中討論(+=)。對其他的增量運算符也同樣適用。
+=背后的特殊方法是__iadd__(用于‘就地加法’),所謂的‘就地’理解為:不創建新的對象,而是將原來的對象重新賦值。如果一個類沒有實現這個方法的話,python會退一步調用__add__.
我們考慮下面這個簡單的表達式:

  • a+=b

  • 討論:
    (1).若a實現了__iadd__方法,就會調用這個方法。同時對于可變序列(list,bytearray和array.array)來說,a會就地變動了,就像調用了a.extend(b)一樣
    (2).若a沒有實現__iadd__方法,a+=b這個表達式的效果就會根a=a+b一樣了;首先計算a+b,得到一個新的對象,然后賦值給a。

  • 總結:
    在這個表達式中,變量名會不會被關聯到新的可變對象,完全取決于這個類型有沒有實現__iadd__這個方法。總的來說,可變序列一般都實現了__iadd__這個方法,因此+=是就地加法。而不可變序列沒有實現這個方法,就會像步驟(2)那樣操作。后者相對應的是__imul__.

例子:

l = [1, 2, 3]
print('before id(l):',id(l))
l *=2
print(l)
print('after id(l):',id(l))
t = (1, 2, 3)
print('before id(t):',id(t))
t *= 2
print('after id(t):',id(t)) # 運用增量懲罰后,新的元組被創建

結果如圖:
在這里插入圖片描述

關于 +=的謎題

t = (1, 2, [30,40])
t[2] += [50, 60]
print(t)

在這里插入圖片描述
結果:t[2]被改動了,但是也有異常出現。但是我們可以寫成t[2].extend([50,60])來避免這個異常。

教訓:

  • 不要把可變對象放在元組里面
  • 增量賦值不是一個原子操。它雖然會拋出異常,但是還是完成了操作
  • 查看python的字節碼并不難,它對我們了解代碼背后的運行機制很有幫助。

補充:extend()方法和+有什么區別呢?

a = [1,2,3]
b = [4,5,6]
c = a+bd = [1,2,3]
e = [4,5,6]
d.extend(e)

結果如圖:
在這里插入圖片描述
結論:
結果是一樣的,但是+號生成的是一個新的對象,而extend則是在原地的修改對象。
extend()的運算效率比+更高。但是, d.extend(e) 的返回結果是None,而不是合并后的序列。d序列是合并后的序列。
c返回的是新的序列。

2.7 list.sort方法和內置函數sorted(排序)

list.sort方法會就地排序列表,這也是這個方法返回None的原因,按照python的慣例:如果一個函數或者方法對對象進行的是就地改動,那它就應該返回None.
與list.sort相反的是sorted,它會新建一個列表作為返回值。這個方法可以接受人和形式的可迭代對象作為參數,甚至包括不可變序列或者生成器,但是它總是返回一個列表。
不管list.sort或者sorted函數,都有兩個參數,reverse和key

  • reverse:默認為False,就是升序排列,True為降序排列
  • key:對一些字符串進行排序的時候,key=str.lower來實現忽略大小寫的排序;key=len來顯示根據字符串長度來排序。

例子:

fruits = ['grape', 'raspberry', 'apple', 'banana']
print("未排序:", fruits)
print(sorted(fruits))
print("sorted:", fruits)
print(sorted(fruits,reverse=True))
print(sorted(fruits,key=len))
print(sorted(fruits,key=len,reverse=True))
print(fruits)
fruits.sort()
print(fruits)

結果如下:
在這里插入圖片描述
可以發現,直到執行了fruits.sort方法,fruits本身才發生了變化。
排好序的序列可以用來進行快速搜索,而標準庫的bisect模塊給我們提供了二分查找算法。

2.8 用bisect來管理已排序的序列

bisect模塊包含類 兩個主要函數,bisect和insert,兩個函數都利用二分查找算法在有序序列中查找或者插入元素。
在有序序列中用bisect查找某個元素的插入位置。
例子1:

import bisect
import sys
HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]
ROW_FMT = '{0:2d} @ {1:2d}   {2}{0:2d}'
def demo(bisect_fn):for needle in reversed(NEEDLES):position = bisect_fn(HAYSTACK, needle) #返回插入的位置offset = position * '  |'print(ROW_FMT.format(needle, position, offset))# return bisect_fnif __name__ == '__main__':if sys.argv[-1] == 'left':bisect_fn = bisect.bisect_left  #當碰到相等的元素的時候,會放在它左邊(前邊) else:bisect_fn = bisect.bisect #或者是bisect_fn = bisect.bisect_right,當碰到相等的元素的時候,會放在它的右邊(后邊)print('DEMO:', bisect_fn.__name__)print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))demo(bisect_fn)

例子2:根據分數找到它對應的成績

import bisect
def grade(score,breakpoint = [60,70,80,90],grades='FDCBA'):i = bisect.bisect(breakpoint,score) # 返回i,匹配gradesreturn grades[i]
t = [grade(score) for score in [33,99,77,70,89,91,10]]
print(t)

輸出:

['F', 'A', 'C', 'C', 'B', 'A', 'F']

2.8.2用bisect.insort插入元素

insort(seq,item) 把變量item插入到序列seq中,并能保持seq的升序順序。

import bisect
import random
SIZE = 7
random.seed(1729)
my_list = []
for i in range(SIZE):new_item = random.randrange(SIZE*2)bisect.insort(my_list, new_item)print('%2d ->' % new_item, my_list)

結果如圖:
在這里插入圖片描述

  • 補充: %和format的區別

參考:https://www.cnblogs.com/zhaopanpan/p/8875765.html (%和format的區別)

2.9 當列表不是首選時

2.9.1 數組

2.9.2內存視圖

2.9.3 NumPy和SciPy

科學計算有關的算法

窺探NumPy二維數組的基本操作

import numpy
a = numpy.arange(12)
print(a)
print(type(a))
print(a.shape)#查看維度
a.shape = 3, 4 #變成二維的
print(a)
print(a[2])
print(a[2, 1])
print(a[:, 1])
t = a.transpose() #行列交換,得到**新的數組**
print(t) 

結果如下:
在這里插入圖片描述
可以發現t是一個新的數組。

2.9.4 雙向隊列和其他的形式的隊列

補充:markdown生成目錄方式,在開頭輸出[toc]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273849.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫 CURD測試題【簡單】

文章目錄1.組合兩個表基本信息要求答案2.第二高的薪水基本信息要求答案3.查找重復的電子郵箱基本信息要求答案4.超過經理收入的員工基本信息要求答案:5.超過5名學生的課信息:要求答案6.有趣的電影信息要求答案7.交換工資(updeta,條件判斷&…

JAVA學習資料整理

今天偶然間發現之前一個群里發過的一篇關于JAVA學習資料的東西。本著服務大眾的精神,搬來了博客園: 《JAVA編程思想》第四版(英文原版)下載地址:http://115.com/file/e7fzi0fm《JAVA開發實戰經典》下載地址&#xff1a…

mysql快速了解

文章目錄數據庫了解:快速操作:安裝mysql啟動,關閉,重啟mysql服務連接mysql的root用戶創建數據庫刪除數據庫選擇數據庫mysql 數據類型MySQL 創建數據表MySQL 刪除數據表MySQL 插入數據MySQL 查詢數據MySQL WHERE 子句BINARY 關鍵字MySQL UPDATE 更新批量更…

javascript編程風格(粗略筆記)

1、空格 緊湊型&#xff1a;    project.MyClass function(arg1, arg2){  松散型&#xff1a;    for( i 0; i < length; i ){ 2、代碼行長度  最多80個字符 3、命名: 采用駝峰式方法命名(開始的第一個單詞小寫&#xff0c;之后的所有單詞首字母大寫)  var …

數據結構 面試題

文章目錄1.數組1.1 尋找數組中第二小的元素1.2 找到數組中第一個不重復出現的整數1.3合并兩個有序數組1.4 重新排列數組中的正值和負值2.棧2.1 前綴表達式&#xff0c;中綴表達式&#xff0c;后綴表達式2.1.1 中綴表達式轉化為后綴表達式2.1.2 中綴表達式轉化為前綴表達式2.2使…

WPF之無法觸發KeyDown或者KeyUp鍵盤事件

有時候我們可能在Panel(StackPanel、Canvas、Grid)上或者是在一些默認不支持Focus的控件上添加了KeyDown或者KeyUp&#xff0c;可是殘酷的現實告訴我們&#xff0c;這是無法觸發的&#xff0c;怎么辦呢&#xff0c;很簡單&#xff0c;只需一句代碼。 private void MouseLeftBut…

宣布在日本地區正式發布 Windows Azure

&#xfeff;&#xfeff;昨天&#xff0c;我與 Microsoft 日本的集團副總裁 Yasuyuki Higuchi 一同站在臺上&#xff0c;宣布在兩個新地區正式發布 Windows Azure&#xff1a;日本東部和日本西部。能夠親自見證 Microsoft 對日本市場的持續承諾&#xff0c;對我來說是莫大的榮…

運行cmd狀態下MySQL導入導出.sql文件

MySQL導入導出.sql文件步驟如下&#xff1a; 一.MySQL的命令行模式的設置&#xff1a; 桌面->我的電腦->屬性->環境變量->新建-> PATH“&#xff1b;path\mysql\bin;”其中path為MySQL的安裝路徑。 二.簡單的介紹一下命令行進入MySQL的方法&#xff1a; 1.C:\&g…

python中的collections

文章目錄deque(雙向列表)defaultdict(為不存在的key設置默認值)OrderedDictOrderedDict可以實現一個FIFO&#xff08;先進先出&#xff09;的dict&#xff0c;Counter參考collections是Python內建的一個集合模塊&#xff0c;提供了許多有用的集合類。deque(雙向列表) 使用list…

mysql 面試點

文章目錄mysql 運算符1.mysql運算符中的 !和Not的區別&#xff1f;CRUD1.條件判斷的用法2. not exits 和not in 的區別3. case when語句mysql函數1.to_days()連接1.什么時候選擇右連接&#xff0c;什么時候選擇左連接&#xff1f;mysql 運算符 1.mysql運算符中的 !和Not的區別…

[Windows Phone] 實作不同的地圖顯示模式

[Windows Phone] 實作不同的地圖顯示模式 原文:[Windows Phone] 實作不同的地圖顯示模式前言 本文章主要示范如何讓地圖有不同的模式產生&#xff0c;例如平面圖、地形圖、鳥瞰圖、鳥瞰圖含街道等。 這部分主要是調整 Map.CartographicMode 屬性&#xff0c;其中 MapCartograph…

數據庫 CURD測試題【中等】

文章目錄1.換座位&#xff08;交換相鄰的id&#xff09;基本信息要求答案[case when]2.分數排名(分組&#xff0c;排序)基本信息要求答案3.連續出現的數字(連接)信息要求答案4.第N高的薪水(函數)信息要求答案5.各個部門工資最高的員工(分組&#xff0c;連接)信息要求答案6.統計…

[STemWin教程入門篇]第一期:emWin介紹

特別說明&#xff1a;原創教程&#xff0c;未經許可禁止轉載&#xff0c;教程采用回復可見的形式&#xff0c;謝謝大家的支持。 armfly-x2,x3,v2,v3,v5開發板裸機和帶系統的emWin工程已經全部建立&#xff0c;鏈接如下&#xff1a; http://bbs.armfly.com/read.php?tid1830 SE…

python 棧【測試題】

文章目錄1.刪除最外層的括號信息要求答案2.棒球比賽信息示例答案3. 用棧實現隊列要求說明:答案4.用隊列模擬棧描述注意答案5.下一個更大的元素&#xff08;未解&#xff09;信息&#xff1a;示例&#xff1a;注意:答案&#xff1a;6.刪除字符串中的所有相鄰重復項信息示例&…

python從socket做個websocket的聊天室server

下面的是server端&#xff1a;把IP改成自己的局域網IP&#xff1a; #coding:utf8 import socket,select import SocketServer import hashlib,base64,time from pprint import pprint#author:lijim def f(key):skey"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"sha1hashli…

python進階(第三章1) 字典

文章目錄3.1 泛映射類型什么是可散列的數據類型&#xff08;鍵的要求&#xff09;字典的構造方法3.2 字典推導(dictcomp)3.3 常見的映射方法用setdefault處理找不到的鍵3.4 映射的彈性鍵查詢3.4.1 defaultdict:處理找不到的鍵的一個選擇注意&#xff1a;defaultdict與dict實例化…

python基礎 list和tuple

文章目錄一、list1、len()函數可以獲得list元素的個數2、索引從0開始3、末尾追加 append(xx)4、也可以把元素插入到指定的位置&#xff0c;比如索引號為1的位置(insert)5、末尾刪除pop() &#xff0c;并且返回該值6、要刪除指定位置的元素&#xff0c;用pop(i)方法&#xff0c;…

HDU 2818 Building Block

題目連接 http://acm.hdu.edu.cn/showproblem.php?pid2818 題意:給定N個blocks&#xff0c;分在N個堆里&#xff0c;然后又P個操作&#xff0c;每次將x所在的堆放在y所在的堆上&#xff0c;或者詢問x的下面有幾個blocks 做法&#xff1a;帶權并查集 因為要查詢x的下面有多少bl…

百度社會化分享組件使用問題

今天下午玩了玩百度的社會化分享sdk,我是在這下載的sdk http://developer.baidu.com/frontia/sdk 誰知道這個下載鏈接是沒更新的,還是1.0版本的,是尼瑪13年初的版本 搗鼓了半天各種bug 然后去百度官網重新找http://developer.baidu.com/wiki/index.php?titledocs/frontia/res…