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


100

だから私はいくつかの既存のリストのサブリストであるリストを作成したいと思います。

例えば、

L = [1, 2, 3, 4, 5, 6, 7]、奇数位置にあるすべての要素lili含むようなサブリストを作成したいと思います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

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


@WaleedKhan:なぜ彼は理解度を質問にリストする必要があるのですか?
Tamara Wijsman 2012

1
@TomWijsman:リスト内包表記。ETA:無視してください:私はあちこち探して、冗談を言っているあなたの答えを見つけました。次回はスマイルを入れてね!
David Robinson、

2
@DavidRobinson:しかし、他の人々はそれを言うことができます、OPが彼が2つの曖昧な言葉で何を意味するかは明確でないかもしれません。コメントを書いてあちこちに刺すだけなので、人々は準備を整えてより良いコンテンツを書きます。OPや訪問者を無知のままにしないように... :)
Tamara Wijsman '15

回答:


229

解決

はい、できます:

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-based であるため、位置)が選択されます。この場合、2番目の要素が選択されます。

2番目の要素が省略されているため、デフォルトが使用されています(リストの最後)。したがって、リストは2番目の要素から最後まで繰り返さます。

また、3番目の引数(step)も指定しました2。つまり、1つの要素が選択され、次の要素はスキップされます。

つまり、まとめると、この場合の[1::2]意味は次のとおりです。

  1. 2番目の要素(ちなみに、インデックスから判断すると奇数要素です)を取ります。
  2. 1つの要素をスキップします(私たちはを持っているstep=2のでstep=1、デフォルトとは逆に1つをスキップしています)、
  3. 次の要素を取り、
  4. 手順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

forPythonでカウンターを使用してループをエミュレートする方法の詳細:Pythonの「for」ループでインデックスにアクセスする


@TomWijsmanは、Pythonスライシング構文を理解するためにこの質問を参照しください
Preet Kukreti '15

質問は奇妙な位置を求めます。これにより、位置が均等になり(0,2,4,6)ます。OPがインデックス望んでいるように聞こえる(1,3,5)によって与えられます、[1,2,3,4,5,6,7][1::2]
Marcin 2012

@Marcin:はい、私は実際に同じ結論に達しました(訂正を参照)。これは、OPのコードを注意深く読んだ後に出てきました。この問題は、インデックス付けのベースが異なるために発生しました(私にとって「奇数」要素は最初の要素を意味し、OPの場合は2番目だったため、でインデックス付けされました1)。
Tadeck

1
@TomWijsman:申し訳ありませんが、あなたが何を変更したかわかりませんでした。確かに、リンクがありますが、それはNumarrayプロジェクトにつながり、Pythonのlistスライスにはつながりません。特に、listのスライスが元のリストへの参照を保持しないため、少し異なります(Numarrayでは、.copy()元の配列を参照していないものを明示的に呼び出す必要があります)。しかし、一部の読者にとってより良いかもしれないものを持っていることは素晴らしいことです。このリンクをコメントに入れてもらえませんか。そうすれば、賛成投票できます。回答のすぐ下に表示されますか?
Tadeck 2012

@Tadeck "奇数番号のインデックス"は、当然、奇数番号のインデックスを意味します。
Marcin、2012

12

奇数の位置については、おそらく次のようにします。

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

3

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

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)。


1
enumerate(items)ではなくenumerate(L)にすべきではありませんか?
ab123

0

ビットごとのAND演算子を使用でき&ます。以下を見てみましょう:

x = [1, 2, 3, 4, 5, 6, 7]
y = [i for i in x if i&1]
>>> 
[1, 3, 5, 7]

ビットごとのAND演算子は1と共に使用され、その理由は、バイナリで記述された奇数は最初の桁が1でなければならないためです。

23 = 1 * (2**4) + 0 * (2**3) + 1 * (2**2) + 1 * (2**1) + 1 * (2**0) = 10111
14 = 1 * (2**3) + 1 * (2**2) + 1 * (2**1) + 0 * (2**0) = 1110

1のAND演算は、値が奇数である場合にのみ、1を返します(2進数の1も最後の桁が1です)。

詳細については、Python Bitwise Operatorページを確認してください。

PS:データフレームで奇数列と偶数列を選択する場合は、この方法を戦術的に使用できます。顔のキーポイントのx座標とy座標が列x1、y1、x2などとして与えられているとします。x座標とy座標を各画像の幅と高さの値で正規化するには、次のように簡単に実行できます。

for i in range(df.shape[1]):
    if i&1:
        df.iloc[:, i] /= heights
    else:
        df.iloc[:, i] /= widths

これは問題に正確に関連しているわけではありませんが、データサイエンティストやコンピュータビジョンエンジニアにとっては、この方法が役立つでしょう。

乾杯!


-1

list_ = list(range(9))print(list_ [1 :: 2])


簡単な説明で答え、いくつかのコードブロックを適切にフォーマットしてください。ありがとう
venkata krishnan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.