そこで、既存のリストのサブリストとなるリストを作成したいと思います。
例えば、
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
しかし、同じことをより少ない手順で効率的に実行できる別の方法があるかどうかを知りたいです。
ベストアンサー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番目の要素が省略されているため、デフォルト(リストの末尾)が使用されています。そのため、リストは反復処理されています。2番目の要素から最後まで。
3 番目の引数 ( step
)も提供しました2
。これは、1 つの要素が選択され、次の要素はスキップされる、ということを意味します。
つまり、まとめると、この場合は次の[1::2]
ようになります。
- 2番目の要素(インデックスから判断すると奇数要素)を取ります。
- 1 つの要素をスキップします ( があるため
step=2
、 とは逆に がデフォルトであるため、1 つをスキップしますstep=1
)。 - 次の要素を取り、
- リストの最後まで手順2~3を繰り返します。
編集: @PreetKukreti は、Python のリスト スライス表記に関する別の説明へのリンクを提供しました。こちらをご覧ください: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 でカウンターを使用してループをエミュレートする方法の詳細:Python の 'for' ループでインデックスにアクセスする