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内の偶数の合計を見つけ、3で割り切れ、1の位が2である100内のすべての数を見つけます。同じタイプが多数あり、この方法でも取得できます:(
これも可能ですがステップを変更することで得られますそれは長いですが、それでもそれについて話す必要があります)

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]

数のすべての要素を見つけます。これは、数が完全であるかどうかを判断するのに役立ちます。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) # <generator object <genexpr> at 0x09AEEE30>
print(type(num))# <class 'generator'>
# 显然好像不是元组
# 这是一个生成器对象
# 我们可以对他进行遍历,也可以使用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))# []

()でラップされているのは実際にはジェネレーター式です。Pythonでは、yieldを使用する関数はジェネレーターと呼ばれます。通常の関数とは異なり、ジェネレーターはイテレーターを返す関数であり、反復にのみ使用できます。操作は理解しやすいです。ジェネレーターがイテレーターであること

# 定义一个返回前n个斐波那契数列生成器函数
def feibo(n):
    a,b = 0,1
    for i in range(n):
        a,b = b ,a+b
        yield a
print(feibo(10))# <generator object feibo at 0x09DDEEB0>
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))# <class 'set'>

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

それは役に立たないと感じます、辞書を逆にするだけでもまだ役に立ちます

習得する必要があるのは、リスト内包表記とジェネレータ式です。


ラララ
みんながまた好きになる時が来ました
ワンクリックでOを3倍にすることもできます
QAQ

おすすめ

転載: blog.csdn.net/hmh4640219/article/details/112600511