Pythonネストリスト解析式(リスト導出式とも呼ばれる)書き方剖析と応用例


#                ,      ,              。
#                。
#                   。
#         :for outter in inner。             ,                 。
#         for  ,    ,        。
#    :                   ,        。
#      ,                   。
#      ,                。      lv2,lv3,lv4,lv4_a
lv2=[range(10),range(10,20)] #lv2       2   
print([e for lv1 in lv2 for e in lv1])
#     :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
print([e for lv1 in lv2 for e in lv1 if e%2==0])
#     :[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

lv3=[[range(10),range(10,20)],[range(20,30),range(30,40)]] #lv3       3   
print([e for lv2 in lv3 for lv1 in lv2 for e in lv1 if e%3==0])
#     :[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39]

#lv4       4   
lv4=[ [ [ [1,2],[3,4,5] ],[[6,7,8,9],[10,11,12,13,14] ] ],[ [ [15,16,17,18,19],[20,21,22,23] ],[ [24,25,26],[27] ] ] ]
print([e for lv3 in lv4 for lv2 in lv3 for lv1 in lv2 for e in lv1 if e%2==1])
#     :[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]

#lv4_a         4   ,         3    。
#                 
#   2              :
# (1)    4         。(     3       )。
# (2)    3         。(     4       )。
lv4_a =[ [ [11, [1,2],[3,4,5] ],[[6,7,8,9],22,[10,11,12,13,14] ] ],[ [ [15,16,17,18,19],33,[20,21,22,23] ],[ [24,25,26],44,[27] ] ] ]
print([e for lv3 in lv4_a for lv2 in lv3 for lv1 in lv2 if isinstance(lv1,list)==True for e in lv1])
#     :[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
print([e for lv2 in lv4_a for lv1 in lv2 for e in lv1 if not isinstance(e,list)])
#     :[11, 22, 33, 44]