web-dev-qa-db-ja.com

奇数位置でリストの要素を抽出する

そこで、既存のリストのサブリストであるリストを作成します。

例えば、

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

しかし、同じことを効率的かつ少ない手順で行う別の方法があるかどうかを知りたいです。

82
veepsk

解決

はい、できます:

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]は次のことを意味します。

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

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'ループのインデックスへのアクセス

193
Tadeck

oddポジションの場合、おそらく以下が必要です。

>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>
10
dstromberg

リストの内包表記が好きなのは、その数学(セット)構文のためです。これはどうですか:

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)を調べることです。

3
peterb