そこで、既存のリストのサブリストであるリストを作成します。
例えば、
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
- based、最初の要素は0
に、2番目は1
などにあります)。
1, 3, 5
結果(実際の数字)は次のようになります:
2, 4, 6
末尾の[1::2]
は、リストスライスの単なる表記です。通常、次の形式です。
some_list[start:stop:step]
start
を省略した場合、デフォルト(0
)が使用されます。したがって、最初の要素(インデックスは0
ベースであるため、位置0
)が選択されます。この場合、2番目の要素が選択されます。
2番目の要素が省略されているため、デフォルトが使用されています(リストの最後)。そのため、リストは2番目の要素から最後まで反復されます。
また、2
である3番目の引数(step
)も提供しました。つまり、1つの要素が選択され、次の要素がスキップされるということです...
つまり、この場合、[1::2]
は次のことを意味します。
step=2
があるため、デフォルトのstep=1
とは反対に1つスキップしています)、EDIT:@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
Pythonのカウンターを使用したfor
ループのエミュレートの詳細: Python 'for'ループのインデックスへのアクセス
oddポジションの場合、おそらく以下が必要です。
>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>
リストの内包表記が好きなのは、その数学(セット)構文のためです。これはどうですか:
L = [1, 2, 3, 4, 5, 6, 7]
odd_numbers = [y for x,y in enumerate(L) if x%2 != 0]
even_numbers = [y for x,y in enumerate(L) if x%2 == 0]
基本的に、リストを列挙すると、インデックスx
と値y
が取得されます。ここでやっていることは、値y
を出力リスト(偶数または奇数)に入れ、インデックスx
を使用して、そのポイントが奇数かどうか(x%2 != 0
)を調べることです。