1. ホーム
  2. python

[解決済み] Pythonです。for x in A[1:]はどういう意味ですか?[重複あり]

2022-03-09 16:43:27

質問

WikipediaからKadaneのアルゴリズムを理解しようとしていたところ、これを見つけました。

def max_subarray(A):
    max_ending_here = max_so_far = A[0]
    for x in A[1:]:
        max_ending_here = max(x, max_ending_here + x)
        max_so_far = max(max_so_far, max_ending_here)
    return max_so_far

私はPythonに精通していません。この構文が何をするのかググってみましたが、何と呼ばれているのかわからず、正しい答えが見つかりませんでした。しかし、私は考えました。 A[1:] を省略したのと同じです。 A[0] と思ったので for x in A[1:]: と同じです。 for(int i = 1; i < A.length; i++) Javaでは

しかし for x in A[1:]: から for x in range(1,len(A)) しかし、私は間違った結果を得ました

馬鹿な質問で申し訳ないのですが、他に答えが見つからないのです。この構文が何をするもので、何と呼ばれているのか、どなたか教えていただけませんか?また、次の構文と同じものを教えてください。 for x in A[1:]: をJavaで表示できますか?

どのように解決するのですか?

これは アレイスライス の構文があります。このSOの質問を参照してください。 Pythonのスライス表記について説明します。 .

リストの場合 my_list のオブジェクト、例えば [1, 2, "foo", "bar"] , my_list[1:] は、0-インデックスで始まるすべての要素の浅いコピーリストと等価です。 1 : [2, "foo", "bar"] . だから、あなたの for 文はこれらのオブジェクトを繰り返し処理します。

for-iteration 0: x == 2 
for-iteration 1: x == "foo" 
for-iteration 2: x == "bar" 

range(..) はインデックス(整数)のリスト/ジェネレータを返すので、for文は整数を繰り返し処理することになります。 [1, 2, ..., len(my_list)]

for-iteration 0: x == 1 
for-iteration 1: x == 2
for-iteration 2: x == 3

つまり、この後者のバージョンでは x をリストへのインデックスとして使用します。 iter_obj = my_list[x] .

また、反復処理のインデックスが必要な場合(例えば、現在のオブジェクトの "count" のために)、もう少し Pythonic なバージョンとして、次のようにすることもできます。 enumerate :

for (i, x) in enumerate(my_list[1:]):
    # i is the 0-based index into the truncated list [0, 1, 2]
    # x is the current object from the truncated list [2, "foo", "bar"]

このバージョンは、将来的に my_list を他のものに変更した場合、0-ベースインデックスの実装に依存しないため、スライス構文をサポートする他の反復処理可能な型でも動作する可能性が高くなります。