Pythonのリストでforループ文を使用したトリックのコンパイル

for ループは最も一般的に使用されるループ ステートメントです。さまざまな高級プログラミング言語で頻繁に使用され、Python でも例外ではありません。従来の for ループまたはネストされた for ループ構文に加えて、Python には絶妙なリストもありますfor ループ文の構文。この構文を使いこなすことができれば、プログラミングの効率化に大きく役立ちます。今日は、for ループの使い方について私が集めたヒントをリストにまとめて紹介します。よろしくお願いします。役に立ちます:

1. for ループを置き換えるだけです

その主な文法構造は次のとおりです。

my_list=[ループ本体内のループ項目の式(if条件)]

ここでの式は、ループ項目、またはループ項目の関数またはメソッドにすることができます。以下の例を見てみましょう。

name = "Donald Trump"

#list内的for循环语法,只使用一句代码
my_list = [c for c in name]

print(name)
print(my_list)

従来の for ループ構文は次のように記述されます。

name = "Donald Trump"

#传统for循环语法,需要使用三句代码
my_list=[]
for c in name:
    my_list.append(c)
    
print(name)   
print(my_list)

ここで、従来の for ループでは 3 行のコードを使用する必要がありますが、リストの for ループでは 1 行のコードのみで同じ機能を実現できます。別の例を見てみましょう:

array = [[16, 3, 7],
          [2, 24, 9],
          [4, 1, 12]]

#表达式可以为循环项的函数
row_min = [min(row) for row in array ]

print(row_min)

上記のコードの機能は、2 次元配列の各行の最小値を見つけることです (実際には、リストはリストに埋め込まれています)。使用されるコードは 1 つだけです。

2. リスト内のループで if 条件を使用します。

names_list = ["Washington", "Trump", "Obama", "bush", "Clinton", "Reagan"]
l1 = [name for name in names_list if name.startswith('W')]
l2 = [name for name in names_list if name.startswith('W') or len(name) < 5]
l3 = [name for name in names_list if len(name) < 5 and name.islower()]
print(l1, l2, l3)

リスト ループで if 条件を使用すると非常に便利であることがわかりました。ここでは、for ループの最後に if 条件ステートメントを使用します。これを従来の for ループ構文に置き換えると、多くの作業が追加される可能性があります。コード。

3. より複雑な式を使用する

names_list = ["washington", "trump", "obama", "bush", "clinton", "reagan"]

#将人名首字母大写
new_names = [name.capitalize() for name in names_list]

print(new_names)

ここで、リスト内の式はループ項目名のメソッド Capitalize() を使用しています。別の例を見てみましょう。

my_list=[ループ本体内のループ項目の式(if...else条件)]

names_list = ["Washington", "Trump", "Obama", "bush", "Clinton", "Reagan"]

#在表达式中使用if条件
new_names = [name if name.startswith('T') else 'Not President' for name in names_list]

print(new_names)

以前は for ループの最後に if 条件を追加しましたが、式の中で if 条件ステートメントを使用することもできます。ここで指摘する必要があるのは、else ステートメントは式内の if 条件ステートメントで使用する必要があるということです。これは、式内の if ステートメントが後に続く必要があるため、for ループの最後に if 条件を追加するのとは異なります。変数に値を割り当てるためのルール。次のような Python 構文:

a = 1
b = 2 if a>0 # 语法错误

b = 2 if a > 0 else -1  

4. ネストされた for ループ構文を使用する

リスト内でネストされた for ループ構文を使用できます。以下の例を見てみましょう。

names_list = ["Trump", "Obama","Clinton"]

#双重for循环
chars = [c for name in names_list for c in name]

print(chars)

以下は、従来の 2 レベルの for ループ ステートメントです。

names_list = ["Trump", "Obama","Clinton"]

#传统的双层for循环,需要使用4句代码
chars = []
for name in names_list:
    for c in name:
        chars.append(c)
        
print(chars)

従来の 2 層のネストされた for ループでは 4 行のコードを使用する必要があるのに対し、リスト内の 2 層の for ループでは 1 行のコードのみを使用していることがわかります。もちろん、従来のコードの可読性はリスト内のループ ステートメントよりも優れているため、リスト内に for ループを追加しすぎるとコードの可読性が低下するため、お勧めできません。

さらに、for ループの 2 つの層の中間で if 条件を使用することもできます。

names_list = ["Trump", "Obama","bush"]

#可以在两层for循环的中间使用if条件
chars = [char for name in names_list if len(name) < 5 for char in name]

print(chars)

5.map() や filter() などの組み込み関数の使用を避けるようにしてください。

Python には、map() や filter() などの組み込み関数がいくつかあります。これらの組み込み関数は使いやすいですが、可読性が低く、理解しにくいという欠点があります。良い習慣は、 Python の作者もこれを推奨しており、この記事( https://www.artima.com/weblogs/viewpost.jsp?thread=98196 ) を読むことができます。コードが読みやすくなりました。

map() 関数は次のように置き換えることができます。

#map 関数
L = map(func, ループ本体)

# 次のように置き換えます:
L = [func(a) for a in ループ本体]

array = [[16, 3, 7],
          [2, 24, 9],
          [4, 1, 12]]

row_min = map(min, array)
print(list(row_min))

#替换为
row_min = [min(row) for row in array ]
print(row_min)

 

filter() 関数は次のものに置き換えることができます。

#フィルター関数
L = filter(condition_func, ループ本体)


# L = [ループ本体の if 条件の a] に置き換えます

names_list = ["Trump", "Obama","bush"]

#filter函数
L1 = filter(lambda name: len(name) < 5, names_list)
print(list(L1))

#替换为:
L2 = [name for name in names_list if len(name) < 5]
print(L2)

6. メモリのオーバーヘッドを減らすためにジェネレータ (Generator )変数 を使用してみてください。

Python でリスト変数を定義する場合、通常、メモリはすぐにリスト変数に割り当てられます。変数を定義するときにすぐにメモリを割り当てるこの方法では、システムのメモリ オーバーヘッドが増加します。効率的な方法は、変数を定義せずに変数のみを定義することです。実際のメモリはすぐには割り当てられず、メモリは変数が実際に使用されるときにのみ割り当てられます。これがジェネレータ変数です。ジェネレータ変数を定義するときは、元のリストの大括弧を括弧で置き換えるだけです。

#list变量,立即分配实际内存
L1 = [x for x in range(1_000_000)]

#Generator变量,不分配实际内存
L2 = (x for x in range(1_000_000))
print(L1.__sizeof__())
print(L2.__sizeof__())

#list变量
L1 = [ w for w in range(10)]
for i in L1:
    print(i)

#替换为生成器变量
L2 = (w for w in range(10))
for i in L2:
    print(i)

結論は

リスト内で for ループを使用すると、コードが簡潔で洗練されたものになりますが、同時に、リスト内の for ループ層の数が増えすぎてプログラムが読みにくくなるのは避けるべきです。マップやフィルターなどの組み込み関数の代わりにリストの for ループを使用するようにしてください。これらの組み込み関数もプログラムを読みにくくするためです。最後に、メモリのオーバーヘッドを軽減できるため、ジェネレーター変数 (Generator) を使用してみる必要があります。

おすすめ

転載: blog.csdn.net/weixin_42608414/article/details/109923442