python——序列構成的數組

 序列構成的數組Demo1列表推導計算笛卡爾積

# -*- coding: utf-8 -*-
colors = ['black','white']
sizes = ['S','M','L']
tshirts = [(color,size)for color  in colors for size in sizes]
print(tshirts)
print("-----------------------------")


for   color  in colors :
    for size  in sizes:
        print((color,size))
        
print("-------------------------------")
tshirts = [(color,sizes) for  size in sizes for  color  in colors]
print(tshirts)

        

 序列構成的數組Demo2使用生成器計算笛卡爾積

# -*- coding: utf-8 -*-
colors = ['black','white']
sizes = ['S','M','L']
for tshirt in ('%s %s'%(c,s)for c in colors for s in sizes):
    print(tshirt)

 序列構成的數組Demo3把元組用作記錄

# -*- coding: utf-8 -*-
lax_coordinates = (33.9425,-118.408056) 
city,year,pop,chg,area = ('Tokyo',2019,32450,0.66,8014)
traveler_ids = [('USA','3143125'),('China','346277666'),('ESP','6343223')]
for  passport in sorted(traveler_ids):
    print("%s/%s"%passport)
    
print("---------------------------------")   
for  country,_ in  traveler_ids:     
    print(country)


#一個元組列表,元組的形式爲(country_code,passport_code)
#在迭代的過程中passport被綁定在每一個元組上
#格式%運算符能被匹配到對應的元組上
#for 循環可以分別提取元組裏的元素,也叫做拆包。
#因爲元組中的第二個元素對我們沒有什麼用,所以給他賦值"_"佔位符
    

 序列構成的數組Demo4元組拆包

# -*- coding: utf-8 -*-
#元組拆包形式一:平行賦值
lax_coordinates = (33.9435,-180.9665)
latitude,longitude = lax_coordinates
print(latitude)
print(longitude)

#形式二:不使用中間變量交換兩個變量的值
a,b = b,a

#形式三:可以用*運算符把一個可迭代對象拆開作爲函數的參數
divmod(20,8)

t = (20,8)
divmod(*t)
quotient,remainder = divmod(*t)
print(quotient,remainder)

#形式四: 讓一個個函數可以用元組的形式返回多個值,
#然後調用函數的代碼就能輕鬆接受這些返回值了
import os
_,filename = os.path.split('/home/luciano/.ssh/idrsa.pub')
filename

#形式五 函數用*args來獲取不確定數量的參數
a,b,*rest = range(5)
print(a,b,rest)

#在平行賦值中,*前綴只能用在一個變量名的前面,
#但是這個變量名可以出現在賦值表達式的任意位置
a,*body,c,d = range(5)
print(a,body,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-New','US',20.104,(40.252564,-74.2043632)),
        ('Sao Paulo','BR',19.649,(-23.363777,-46.4737257)),
        ]
print ('{:20} |{:^9}|{:^9}'.format('','lat.','long'))
fmt = '{:20}  |{:9.4f}  |{:9.4f}'
for  name,cc,pop,(latitude,longititude) in  metro_areas:
    print(fmt.format(name,latitude,longititude))

 序列構成的數組Demo5之具名元組

# -*- coding: utf-8 -*-
# 1:定義和使用具名函數
"""
collections.namedtuple 是一個工廠函數,
可以用來構建一個帶字名段的元組和一個有名字的類
"""
from collections import  namedtuple
City = namedtuple("City","name country population coordinates")  # 
tokyo = City("Tokyo","JP",933,(35.689722,139.695745))  #  2
print(tokyo)
print(tokyo.population ) #  3
print(tokyo.coordinates)
print(tokyo[1])
"""
  1:創建一個具名元組需要兩個參數,一個是類名,另一個是類的各個字段的名字。
    後者可以是由數個字符串組成的可迭代對象,或者是由空格分隔開的字段名組成的字符串
  2:存放在對應字段裏的數據要以一串參數的形式傳入到構造函數中,(元組的構造函數卻只接受單一的可迭代對象)
  3:可以通過字段名或者位置來獲取一個字段的信息
"""
# 2:具名元組的屬性和方法

City._fields  #  1
LatLong= namedtuple('LatLong','lat long')
delhi_data = ("China","in",21.935,LatLong(28.61456,77.63456457))
delhi = City._make(delhi_data)  # 2
delhi._asdict()   # 3
OrderedDict(([('name','China'),('country','in'),
              ('population',21.2345),('coordinates',
              LatLong(lat =28.6145,long =77.6345645))])
for key,value in  delhi._asdict().items():
    print(key +':',value)
 """
 1:_fileds屬性是一個包含這個類所有字段名稱的元組
 2:用——make()通過接受一個可迭代對象來生成這個類的實例,他的作用跟City(*delhi_data)一樣
 3:_asdict()把具名元組以collections.OrderedDict的形式返回

序列構成的數組Demo6切片

# -*- coding: utf-8 -*-

#  純文本文件形式的收據以一行字符串的形式被解析

invoice = """
...0.....6.........................40.........52...55..........
1909  Pimoroni PiBrella              $17.50   3   $52.50
1489  6mm   Tactile Switch  x20      $4.95    2   $9.50
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,40)
UNIT_PRICE = slice(40,52)
QUANTITY = slice(52,55)
ITEM_TOTAL = slice(55,None)
line_items = invoice.split('\n')[2:]
for  item in line_items:
    print(item[UNIT_PRICE],item[DESCRIPTION])

"""
給切片賦值
"""
l = list(range(10))
l
l[2:5] = [20,30]
l
del l[5:7]
l
l[3::2] = [11,22]
l
l[2:5] =100   #  1
l
l[2:5]= [100]

"""
如果賦值的對象是一個切片,那麼賦值語句的右側必須是一個可迭代的對象(list,tuple,str)
即便有單獨的一個指,也要把他轉化成可迭代的序列
"""

序列構成的數組Demo7建立由列表組成的列表

 

# -*- coding: utf-8 -*-
board = [['']*3 for i  in range(3) ]  #  1
print(board)
print(board[1][2] = 'X' ) #  2
"""
1:建立一個包含3個列表的的列表,被包含的3個列表各自有3個元素。
2:把第一行第二列的元素標記爲X,再打印出這個列表

"""

# 含有三個指向同一對象的引用的列表是毫無用處的
weird_board = [['_']*3]*3  #  1 

print(weird_board)
weird_board[1][2] = '0'  #   2
print(weird_board)
"""
1: 外面的列表其實包含3個指向同一列表的引用。
2:當我們嘗試修改[1][2]的元素,就暴露了列表內3個元素指向同一位置的事實  
"""

序列構成的數組Demo8序列的增量賦值

# -*- coding: utf-8 -*-
l = [1,2,3]
print(id(l))   #  1
l*=2
iprint(d(l))   #  2
t = (1,2,3)
print(id(t) )  #  3
t *=2
print(id(t))     #   4
 """
  1.剛開始時的列表id
  2。運用增量懲罰後,列表id沒變,新元素追加到列表上
  3.元組最開始的id
  4.運用增量後,新的元組被創建
  """
  

序列構成的數組Demo9用bisect來管理已排好的序列

# -*- coding: utf-8 -
"""
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)   #  1
        offset = position*' | '   #  2
        print(ROW_FMT.format(needle,position,offset))   #  3
if __name__ =='__main__' :
    if  sys.argv[-1] == 'left':   #  4
        bisect_fn = bisect.bisect_left
    else:
        bisect_fn = bisect.bisect
    print('DEMO:',bisect_fn.__name__)   #  5
    print('haystack->',''.join('%2d'% n  for n in  HAYSTACK))
    demo(bisect_fn)
 
    

    1.用特定的bisect函數來計算元素應該出現的位置
    2。利用該位置計算注需要幾個分隔符號
    3.把元素和其應該出現的位置打印出來
    4.根據命令上最後一個參數來選用bisect函數
    5.把選定的函數在擡頭打印出來
  
 

   # bisect 可以用來建立一個用數字作爲索引的查詢表格,比如說把分數和成績對應起來

    #  根據一個分數,找到它對應的成績
  
def  grade(score,breakpoints = [60,70,80,90], grades = 'FDCBA') :
    i = bisect.bisect(breakpoints,score)
    return grades[i]
print( [grade(score) for score in [33,99,55,70,67,89,90,100]])

當排序很費時時,在得到一個有序序列時,最好保持它的有序,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)

 序列構成的數組Demo10sorted ,sort.

# -*- coding: utf-8 -
"""
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)   #  1
        offset = position*' | '   #  2
        print(ROW_FMT.format(needle,position,offset))   #  3
if __name__ =='__main__' :
    if  sys.argv[-1] == 'left':   #  4
        bisect_fn = bisect.bisect_left
    else:
        bisect_fn = bisect.bisect
    print('DEMO:',bisect_fn.__name__)   #  5
    print('haystack->',''.join('%2d'% n  for n in  HAYSTACK))
    demo(bisect_fn)
 
    

    1.用特定的bisect函數來計算元素應該出現的位置
    2。利用該位置計算注需要幾個分隔符號
    3.把元素和其應該出現的位置打印出來
    4.根據命令上最後一個參數來選用bisect函數
    5.把選定的函數在擡頭打印出來
  
 

   # bisect 可以用來建立一個用數字作爲索引的查詢表格,比如說把分數和成績對應起來

    #  根據一個分數,找到它對應的成績
  
def  grade(score,breakpoints = [60,70,80,90], grades = 'FDCBA') :
    i = bisect.bisect(breakpoints,score)
    return grades[i]
print( [grade(score) for score in [33,99,55,70,67,89,90,100]])

當排序很費時時,在得到一個有序序列時,最好保持它的有序,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)

序列構成的數組Demo11numpy

# -*- coding: utf-8 -*-
"""
from  array import  array             # 1
from  random  import random
floats = array('d',(random() for  i  in range(10**7)))         #  2
print(floats[-1]) #  3
fp = open('floats.bin','wb')
floats.tofile(fp)  #  4
fp.close()
floats2 = array('d')  #   5
fp = open('floats.bin','rb')
floats2.fromfile(fp,10**7)   #  6
fp.close
print(floats2[-1])   #   7
print(floats2 ==floats)             #  8

1.引入array類型
2.利用一個可迭代對象來建立一個雙精度浮點數組(類型碼是'd'),
這裏我們用的是一個生成器表達式
3.查看數組的最後一個元素
4.把數組存入一個二進制文件中
5.新建一個雙精度浮點空數組
6.把1000萬個浮點數從二進制文件裏讀取出來
7.查看新數組的最後一個元素
8.檢查倆個數組的內容是不是完全一樣
.numpy字符編碼

整數 :i
無符號整數:u
單精度浮點數:f
雙精度浮點數:d
布爾值:b
複數:D
字符串:s
unicode字符串:U
void(空):v


#  通過改變數組中的某一個字節來更新數組裏某個元素的值
import array
numbers = array.array('h',[-2,-1,0,1,2])
memv = memoryview(numbers)   #  1
print(len(memv))
print(memv[0])       #  2
memv_oct = memv.cast('B')      #  3
print(memv_oct.tolist())     #  4
memv_oct[5] = 4         #  5
print(numbers)          # 6


1.利用 含有5個短整型由符號整數的數組(類型碼是'h')創建一個memoryview
2.memv裏的5個元素跟數組裏的沒有區別
3.創建一個memv_oct,把memv裏的內容轉換成'B'類型,
也就是無符號字符
4.以列表的形式查看memv_oct的內容
5.把位於位置5的字節賦值成4
6.因爲我們把佔2個字節的整數的高位字節改成了4 ,
所以這個有符號整數的值就變成了1024



#  演示一下NumPy二維數組的基本操作:對numpy.ndarray的行和列進行基本操作
import  numpy  #  1
a = numpy.arange(12)  #  2
print(a)
print(type(a))
print(a.shape)   #
a.shape =  3,4  # 4
print(a)  
print(a[2])    #      5
print(a[2,1])   #  6
print(a[:,1])   #  7
print(a.transpose())  #  8

1.導入
2,新建一個0~11的整數numpy.ndarray,然後把它打印出來
3.看看數組的維度,他是一個一維的,有12個元素的數組
4.把數組變成二維數組,然後打印出來
5.打印第二行
6.打印第二行第一列的元素
7.把第一列打印出來
8.把行和列交換,就得到一個新數組


#使用雙向隊列
"""  

from  collections import deque
dq = deque(range(10),maxlen = 10)   #  1
print(dq)
dq.rotate(3)      #         2
print(dq)
dq.rotate(-4)      
print(dq)
dq.appendleft(-1)   #        3
print(dq)
dq.extend([11,22,33])        #  4
print(dq)
dq.extendleft([10,20,30,40])  #  5
print(dq)
"""
1.maxlen是一個可選參數,代表這個隊列可以容納的元素的數量,
而且一旦設定,這個屬性就不能修改了
2隊列的旋轉操作可以接受一個參數n,
當n>0時,隊列的最右邊的n個元素會被移動到隊列的左邊,
當n<0時,最做左邊的n個元素會被移動到右邊
3當試圖對一個已滿(len(d)==d.maxlen)的隊列做頭部添加操作的時候,
它尾部的元素會被刪除掉,注意在一下行裏,元素0被刪除掉
4.在尾部添加三個元素的操作會擠掉-1,1,2
5.extendleft(iter)方法會把迭代器裏的元素逐個添加到雙向對列的左邊,
因此迭代器裏的元素會逆序出現在隊列裏

"""


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章