1. ホーム
  2. python

[解決済み] リストの奇数位置の要素を抽出する

2022-07-30 14:18:29

質問

既存のリストのサブリストとなるリストを作成したいのですが、どうすればよいでしょうか。

例えば

L = [1, 2, 3, 4, 5, 6, 7] というサブリストを作りたい場合 li このような li に含まれるすべての要素を含む。 L の全ての要素を含む。

でできるのに対して

L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
    if count % 2 == 1:
        li.append(i)
    count += 1

しかし、同じことをより少ないステップ数で効率的に行う別の方法があるかどうかを知りたいのです。

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

解決方法

はい、できます。

l = L[1::2]

と、これだけです。結果には、以下の位置に配置された要素( 0 -をベースにしているので、最初の要素は位置 0 にあり、2 番目の要素は 1 など)。

1, 3, 5

となるので、結果(実際の数値)は

2, 4, 6

説明

この [1::2] はリストスライスのための単なる表記法です。通常は以下のような形になっています。

some_list[start:stop:step]

を省略した場合 start を省略した場合、デフォルトの( 0 ) が使われます。そのため、最初の要素(位置 0 であるため,インデックスが 0 -をベースにしているため)が選択されるでしょう。この場合、2番目の要素が選択されます。

2番目の要素が省略されているため、デフォルト(リストの最後)が使用されています。つまり、リストが反復されているのです を繰り返していることになります。 .

また、第3引数( step ) も用意しました。 2 . つまり、ある要素が選択され、次の要素はスキップされ、といった具合になります。

つまり、要約すると、この場合 [1::2] は意味します。

  1. は2番目の要素を取ります(ちなみに、インデックスから判断すると、奇数の要素です)。
  2. 要素をひとつ飛ばし (なぜなら私たちは step=2 とは逆に、1つスキップしています。 step=1 はデフォルトです)。
  3. 次の要素を取る。
  4. リストの最後に到達するまで、手順2.~3.を繰り返す。

EDIT : Pythonのリストスライス記法について、@PreetKukretiが別の説明のリンクをくれました。こちらをご覧ください。 Python のスライス記法について説明する

番外編 - カウンタを enumerate()

あなたのコードでは、明示的にカウンターを作成し、増やしています。Pythonでは、これは必要ありません。 enumerate() :

for count, i in enumerate(L):
    if count % 2 == 1:
        l.append(i)

上記は、あなたが使っていたコードと全く同じ目的を果たします。

count = 0
for i in L:
    if count % 2 == 1:
        l.append(i)
    count += 1

エミュレーションの詳細 for ループをエミュレートします。 Pythonの'for'ループでインデックスにアクセスする