Pythonリスト導出ジェネレータ式


リスト導出式
#                       
#            for          
a = [m for m in range(31)]
print(a)# [0, 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, 28, 29, 30]

b = [a[m:m + 3] for m in range(0, 31, 3)]#    a       a  
print(b)# [[0, 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, 28, 29], [30]]

c = [(a, b) for a in range(0, 2) for b in range(3, 5)]
print(c)# [(0, 3), (0, 4), (1, 3), (1, 4)]

i = [[1, 4, 7],
     [2, 5, 8],
     [3, 6, 9]]
d = [row[1] for row in i]
print(d) # [4, 5, 6]

e = [i[j][j] for j in range(len(i))]
print(e) # [1, 5, 9]

f = [i[j][2-j] for j in range(len(i))]
print(f)# [7, 5, 3]

ループの後で判断することもできます.これにより、簡単なデータフィルタリングができます.次のプレゼンテーションを見てください.
num3 = [1,-1,2,-2,-10,3,4]
print([x for x in num3 if x > 0])# [1, 2, 3, 4]

100以内の偶数と、100以内のすべての3で割り切れる、しかも個位が2の数を求めるには、同じタイプのものがたくさんあります.
num1 = [x for x in range(101) if x % 2 == 0]#          
print(sum(num1))# 2550
print([i for i in range(101) if i % 3 == 0 and  i % 10 == 2])# [12, 42, 72]

リスト内の値を乗算することもできます.たとえば、べき乗演算を行います.
print([i ** 2 for i in range(5)])# [0, 1, 4, 9, 16]

1つの数のすべての因子を求めることは、1つの数が完数であるか否かを判断するのに役立ち、n+1をnに置き換えるだけでよいので、和を求めて比較する(完数とは、その数が自身以外の因子の和にちょうど等しいことである.例えば、6=1+2+3)
n = 6
print([i for i in range(1,n+1) if n % i == 0])# [1, 2, 3, 6]

類推する
リスト導出式がありますが、メタグループ、辞書、集合導出式はありますか?これは私たちが考えるべきことです.じゃ、今からやってみましょう.包装を変えただけです.
num = (i for i in range(5))
print(num) #  at 0x09AEEE30>
print(type(num))# 
#         
#          
#           ,     next()      
#              ,          ,
#                ,         
#       
for i in num :
    print(i)
# 0
# 1
# 2
# 3
# 4
print(list(num))# []

# print(next(num))# 0
# print(next(num))# 1
# print(next(num))# 2
# print(next(num))# 3
# print(next(num))# 4
# print(list(num))# []

()で包むのは実は1つのジェネレータ式で、Pythonの中でyieldの関数を使ってジェネレータと呼ばれて、普通の関数と異なって、ジェネレータは1つの反復器を返す関数で、反復操作にしか使えなくて、もっと簡単にジェネレータが1つの反復器であることを理解します
#        n            
def feibo(n):
    a,b = 0,1
    for i in range(n):
        a,b = b ,a+b
        yield a
print(feibo(10))# 
print(list(feibo(10)))# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

ジェネレータ式が単独のパラメータとして関数に渡される場合の外側de()は、ジェネレータ式をパラメータとして省略することができ、一時リストを作成するよりも効率的です.
s1 = sum((x for x in range(101))) #                
s2 = sum(x for x in range(101)) #          ,     
print(s1)# 5050
print(s2)# 5050
# min()、max()      
person = [
    {
     'name':'zhangsan','age':20},
    {
     'name':'lisi','age':18},
    {
     'name':'wangwu','age':16},
    {
     'name':'maliu','age':17},
]
print(min(p['age'] for p in person))# 16
print(min(person,key=lambda p:p['age']))# {'name': 'wangwu', 'age': 16}

見てみましょう
a = {
     x for x in range(10)}
print(a)# {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
print(type(a))# 

student = {
     
    'name':'zhangsan','age':18
}
b = {
     x:y for y,x in student.items()}
print(b)# {'zhangsan': 'name', 18: 'age'}
print(type(b))# 

何の役にも立たないような気がして、辞書を1つ反転するだけでもう1つの役に立つ.
リスト導出式とジェネレータ式に重点を置く必要があります
やれやれ
またみんなにほめてもらう時が来た
ワンクリック三連Oも可能です
QAQ