生活随笔
收集整理的這篇文章主要介紹了
流畅的Python 2. 数据结构 - 序列构成的数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄 1. 內置序列 2. 列表推導 []、生成器() 表達式 3. 元組 tuple 4. 切片 5. `+, *` 操作 6. 增量賦值 7. 排序 8. bisect管理已排序序列 8.1 用 bisect.bisect 二分搜索 8.2 用 bisect.insort 二分插入新元素 9. 列表的替代 9.1 數組 9.2 內存視圖 9.3 NumPy、SciPy 9.4 隊列
1. 內置序列
容器序列:list, tuple, collections.deque 能存放不同類型 的數據,存放的是對象的引用 扁平序列:str, bytes, bytearray, memoryview, array.array 只能存一種 類型,存放的是值 (只能存字符、字節、數值這種基礎類型)
按照是否可修改:
可變序列:list,bytearray,array.array,collections.deque,memoryview 不可變序列:tuple, str, bytes
2. 列表推導 []、生成器() 表達式
x
= "ABC"
y
= [ ord ( x
) for x
in x
]
print ( x
)
print ( y
)
symbols
= '$¢£¥€¤'
beyond_ascii
= [ ord ( s
) for s
in symbols
if ord ( s
) > 127 ]
print ( beyond_ascii
)
beyond_ascii
= list ( filter ( lambda c
: c
> 127 , map ( ord , symbols
) ) )
print ( beyond_ascii
)
colors
= [ 'black' , 'white' ]
sizes
= [ 'S' , 'M' , 'L' ]
t_shirts
= [ ( color
, size
) for color
in colors
for size
in sizes
]
print ( t_shirts
)
t_shirts
= [ ( color
, size
) for size
in sizes
for color
in colors
]
print ( t_shirts
)
生成器表達式
逐個 的產出元素,背后遵守了迭代器 協議,相比 列表 去初始化其他類型,生成器表達式 更節省內存 ,它不會一次性產生全部的組合語法跟列表推導差不多,把 [ ] 改成 ( )
symbols
= '$¢£¥€¤'
print ( tuple ( ord ( symbol
) for symbol
in symbols
) )
import array
print ( array
. array
( 'I' , ( ord ( symbol
) for symbol
in symbols
) ) )
for t_shirt
in ( '{}, {}' . format ( c
, s
) for c
in colors
for s
in sizes
) : print ( t_shirt
)
3. 元組 tuple
lax_coordinates
= ( 33.9425 , - 118.408056 )
city
, year
, pop
, chg
, area
= ( 'Tokyo' , 2003 , 32450 , 0.66 , 8014 )
traveler_ids
= [ ( 'USA' , '31195855' ) , ( 'BRA' , 'CE342567' ) , ( 'ESP' , 'XDA205856' ) ]
for passport
in sorted ( traveler_ids
) : print ( '{}/{}' . format ( passport
[ 0 ] , passport
[ 1 ] ) ) print ( '%s/%s' % passport
)
元組拆包 %, = 必須保證兩側的元素數量一樣,不一樣多,可以使用 * 忽略多余元素
lax_coordinates
= ( 33.9425 , - 118.408056 )
latitude
, longitude
= lax_coordinates
print ( latitude
, longitude
) a
, b
= 1 , 2
a
, b
= b
, a
print ( a
, b
) print ( divmod ( 20 , 8 ) )
t
= ( 20 , 8 )
print ( divmod ( * t
) )
quotient
, remainder
= divmod ( * t
)
print ( quotient
, remainder
) import os
path
, filename
= os
. path
. split
( "c:/abd/tuple.py" )
print ( path
)
print ( filename
)
a
, b
, * rest
= range ( 5 )
print ( a
, b
, rest
)
a
, b
, * rest
= range ( 3 )
print ( a
, b
, rest
)
a
, b
, * rest
= range ( 2 )
print ( a
, b
, rest
) a
, * body
, c
, d
= range ( 5 )
print ( a
, body
, c
, d
)
* head
, b
, c
, d
= range ( 5 )
print ( head
, b
, c
, d
)
metro_areas
= [ ( 'Tokyo' , 'JP' , 36.933 , ( 35.689722 , 139.691667 ) ) , ( 'Delhi NCR' , 'IN' , 21.935 , ( 28.613889 , 77.208889 ) ) , ( 'Mexico City' , 'MX' , 20.142 , ( 19.433333 , - 99.133333 ) ) , ( 'New York-Newark' , 'US' , 20.104 , ( 40.808611 , - 74.020386 ) ) , ( 'Sao Paulo' , 'BR' , 19.649 , ( - 23.547778 , - 46.635833 ) ) ,
] print ( '{:>15} | {:<9} | {:^9}' . format ( 'table' , 'lat.' , 'long.' ) )
fmt
= '{:15} | {:9.3f} | {:9.4f}'
for name
, cc
, pop
, ( latitude
, longitude
) in metro_areas
: if longitude
<= 0 : print ( fmt
. format ( name
, latitude
, longitude
) )
有名字的元組 collections.namedtuple ,構建一個帶字段名的元組和一個有名字的類 其構建的實例比普通對象小一些,因為它不會用 __dict__ 來存放屬性
from collections
import namedtupleCity
= namedtuple
( 'City' , 'name country population coordinates' )
tokyo
= City
( 'Tokyo' , 'JP' , 36.933 , ( 35.689722 , 139.691667 ) )
print ( tokyo
)
print ( tokyo
. population
)
print ( tokyo
. coordinates
)
print ( tokyo
[ 1 ] ) print ( City
. _fields
)
LatLong
= namedtuple
( 'LatLong' , 'lat long' )
delhi_data
= ( 'Delhi NCR' , 'IN' , 21.935 , LatLong
( 28.613889 , 77.208889 ) )
delhi
= City
. _make
( delhi_data
)
print ( delhi
. _asdict
( ) )
for k
, v
in delhi
. _asdict
( ) . items
( ) : print ( k
+ ':' , v
)
4. 切片
像 list, tuple, str 等序列類型都支持切片
seq[start:stop:step] 從 start 開始,到 stop(不包含)結束,每間隔 step 個取一次,其調用seq.__getitem__(slice(start, stop, step))
invoice
= """
1909 Pimoroni PiBrella $17.50 3 $52.50
1489 6mm Tactile Switch x20 $4.95 2 $9.90
1510 Panavise Jr. - PV-201 $28.00 1 $28.00
1601 PiTFT Mini Kit 320x240 $34.95 1 $34.95
"""
SKU
= slice ( 0 , 6 )
DESCRIPTION
= slice ( 6 , 30 )
UNIT_PRICE
= slice ( 30 , 37 )
QUANTITY
= slice ( 37 , 39 )
ITEM_TOTAL
= slice ( 39 , None )
line_items
= invoice
. split
( '\n' ) [ 1 : ]
for item
in line_items
: print ( item
[ UNIT_PRICE
] , item
[ DESCRIPTION
] )
l
= list ( range ( 10 ) )
print ( l
)
l
[ 2 : 5 ] = [ 20 , 30 ]
print ( l
)
del l
[ 5 : 7 ]
print ( l
)
l
[ 3 : : 2 ] = [ 11 , 22 ]
print ( l
)
5. +, * 操作
使用 + * ,拼接,產生新的序列 注意 不要在 [[list]]*n 外側乘以 n ,它們 n 個都指向同一個list
l
= [ 1 , "abc" , 3 ]
print ( 2 * l
)
print ( l
)
s
= "abc"
print ( s
* 2 )
print ( s
)
l
= [ [ 1 , 2 , 3 ] ] * 3
print ( l
)
l
[ 0 ] [ 0 ] = 100
print ( l
)
l
= [ [ 1 , 2 , 3 ] for i
in range ( 3 ) ]
print ( l
)
l
[ 0 ] [ 0 ] = 100
print ( l
)
6. 增量賦值
+=,*= 等,+= 背后對應于 __iadd__() 就地加法 ,如果類沒有實現這個方法,會調用 __add__()
l
= [ 1 , 2 , 3 ]
print ( id ( l
) )
l
*= 2
print ( l
)
print ( id ( l
) ) t
= ( 1 , 2 , 3 )
print ( id ( t
) )
t
*= 2
print ( t
)
print ( id ( t
) )
7. 排序
list.sort() 就地 排序,返回 None,沒有復制 內置函數 sorted() ,會新建 一個列表返回 都有關鍵字,reverse 默認False升序, key排序函數(自定義,len,str.lower)
8. bisect管理已排序序列
8.1 用 bisect.bisect 二分搜索
def grade ( score
, breakpoints
= [ 60 , 70 , 80 , 90 ] , grades
= 'FDCBA' ) : i
= bisect
. bisect
( breakpoints
, score
) return grades
[ i
] ans
= [ grade
( score
) for score
in [ 33 , 99 , 77 , 70 , 89 , 90 , 100 ] ]
print ( ans
)
8.2 用 bisect.insort 二分插入新元素
insort(seq, item) 把變量 item 插入到序列 seq 中,并能保持 seq 的升序順序
import random
, timerandom
. seed
( time
. time
( ) )
l
= [ ]
for i
in range ( 7 ) : new_item
= random
. randrange
( 20 ) bisect
. insort
( l
, new_item
) print ( '{:2} ->' . format ( new_item
) , l
)
9. 列表的替代
9.1 數組
只包含數字的列表,array.array 比 list 更高效,支持所有可變序列的操作 還可以 從文件讀取 和 存入文件,.frombytes,.tofile
from array
import array
from random
import randomfloats
= array
( 'd' , ( random
( ) for i
in range ( 10 ** 7 ) ) )
print ( floats
[ - 1 ] )
f
= open ( "floats.bin" , "wb" )
floats
. tofile
( f
)
f
. close
( )
floats1
= array
( 'd' )
f
= open ( "floats.bin" , "rb" )
floats1
. fromfile
( f
, 10 ** 7 )
f
. close
( )
print ( floats
[ - 1 ] )
print ( floats
== floats1
)
pickle.dump 幾乎可以處理所有內置數字類型(復數,嵌套集合,自定義類)
9.2 內存視圖
nums
= array
( 'h' , [ - 2 , - 1 , 0 , 1 , 2 ] )
menv
= memoryview ( nums
)
print ( len ( menv
) )
print ( menv
[ 0 ] )
menv_oct
= menv
. cast
( 'B' )
print ( menv_oct
. tolist
( ) )
menv_oct
[ 5 ] = 4
print ( nums
)
9.3 NumPy、SciPy
略
9.4 隊列
列表在 頭部 pop,或者 insert 時,比較費時,會移動元素 collections.deque 類(雙向隊列)是一個線程安全、可以快速從兩端添加或者刪除元素的數據類型
from collections
import dequedq
= deque
( range ( 10 ) , maxlen
= 10 )
print ( dq
)
dq
. rotate
( 3 )
print ( dq
)
dq
. rotate
( - 4 )
print ( dq
)
dq
. appendleft
( - 1 )
print ( dq
)
dq
. extend
( [ 11 , 22 , 33 ] )
print ( dq
)
dq
. extendleft
( [ 10 , 20 , 30 , 40 ] )
print ( dq
)
還有一些 PriorityQueue,Queue,LifoQueue,heapq等隊列
總結
以上是生活随笔 為你收集整理的流畅的Python 2. 数据结构 - 序列构成的数组 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。