pythonのリスト解析

3449 ワード

1.紹介
リスト解析は反復プロトコルを最もよく適用する環境の1つであり,forループとともに使用される.まず簡単な例を見てみましょう.
#for  
L=[1,2,3,4,5]
for i in range(len(L)):
    L[i]+=10           #result:L=[11,12,13,14,15]
#   
#    
L=[1,2,3,4,5]
L=[x+10 for x in L]     #result:[11,12,13,14,15]

技術的に言えば、リスト解析は本当に必要ではありません.なぜなら、forループで結果を表すリストを手動で構築することができるからです.しかし、リスト解析の作成はより簡素化され、実行速度はより速く(2倍速い).
2.ファイル上でのリスト解析の使用
f=open('salary.txt')
lines=f.readlines()
print(lines)
#result:['lastName hoursWorked hourlyWage
', 'Bob 4 80
', 'Ann 8 160
'] # (
) #rstrip : , line[:-1] lines=[line.rstrip() for line in lines] print(lines) #result:['lastName hoursWorked hourlyWage', 'Bob 4 80', 'Ann 8 160']

3.拡張リスト解析構文
非常に有用な拡張:式のネストされたforループには、テストが真ではない結果アイテムをフィルタするために関連するif句があります.
#  1~9         
#  1:    +if  
even=[x**3 for x in range(1,10) if x%2==0]
print(even)  #result: [8, 64, 216, 512]
#  2:    +filter+lambda  
even=list(filter((lambda x:x%2==0),[x**3 for x in range(1,10)]))
print(even)  #result: [8, 64, 216, 512]
#  3:map+filter+lambda  (     map        ,map   for    2 )
even=list(filter(lambda x:x%2==0,map((lambda x:x**3),range(1,10))))
print(even)  #result: [8, 64, 216, 512]

x+y接続のリストを構築
#           x           y    
lst=[x+y for x in 'abc' for y in 'lmn']
print(lst)    #result:['al', 'am', 'an', 'bl', 'bm', 'bn', 'cl', 'cm', 'cn']

4.リスト解析と行列(多次元配列とも呼ばれる)
多次元マトリクスの作成(行列値の位置に注意):
#    row col     ,  row col      
row=5
col=6
#  1:    
arr1=[[0 for c in range(col)] for r in range(row)]
#  2:      !!!             ,             
arr2=[[0]*col]*row
#  3:numpy  zeros  ,dtype  float64,    ,    
import numpy as np
arr3=np.zeros((row,col),dtype=int)

一般的な操作:
M=[[1,2,3],
   [4,5,6],
   [7,8,9]]
N=[[2,2,2],
   [3,3,3],
   [4,4,4]]

#   
M[1]    #return:[4,5,6]

#   ,  row      ,      ,     ,      
#  1:     :row=[1,2,3];     :row=[4,5,6];     :row=[7,8,9]
[row[1] for row in M]   #return:[2,5,8]
#  2:
[M[row][1] for row in range(3)]    #return:[2,5,8]

#     (              )   
[M[i][i] for i in range(len(M))]    #return:[1, 5, 9]

#           ,      col row   
[M[row][col]*N[row][col] for row in range(3) for col in range(3)]
#return:[2, 4, 6, 12, 15, 18, 28, 32, 36]
[[M[row][col]*N[row][col] for col in range(3)] for row in range(3)]
#return:[[2, 4, 6], [12, 15, 18], [28, 32, 36]]

5.集合解析と辞書解析
#    
{x*x for x in range(10)}      #result:{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
#   :
set(x*x for x in range(10))   #result:{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

#      
{x*x for x in range(10) if x%2==0}   #result:{0, 4, 16, 36, 64}
#  :     (12)    ,  12     
{x*y for x in [1,2,3] for y in [4,5,6]} #result:{4, 5, 6, 8, 10, 12, 15, 18}


#    
{x:x*x for x in range(10)}
#result:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
#   :
dict((x,x*x) for x in range(10))
#result:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

#      
{x:x*x for x in range(10) if x%2==0}  #result:{0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
#     {1:4,1:5,1:6,2:4,2:5,2:6,3:4,3:5,3:6},     key      value,           
{x:y for x in [1,2,3] for y in [4,5,6]}  #result:{1: 6, 2: 6, 3: 6}