124

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

例えば、

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

私はそれをすることができますが

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

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

4

4 に答える 4

285

解決

はい、できます:

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

  1. 2番目の要素(ちなみに、インデックスから判断すると奇妙な要素です)を取ります。
  2. 1つの要素をスキップします(これはstep=2、があり、デフォルトであるのとは逆に、1つの要素をスキップしているためstep=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」ループのインデックスへのアクセス

于 2012-09-15T01:08:49.920 に答える
13

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

>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>
于 2012-09-15T01:30:04.403 に答える
7

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

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)であるかどうかを確認することです。

于 2016-08-24T14:02:52.567 に答える
0

ビットごとのAND演算子を使用できます&

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

これにより、リスト内の奇妙な要素が得られます。ここで、奇数のインデックスの要素を抽出するには、上記を少し変更する必要があります。

>>> x = [10, 20, 30, 40, 50, 60, 70]
>>> y = [j for i, j in enumerate(x) if i&1]
[20, 40, 60]

説明

ビットごとのAND演算子は1で使用されます。これが機能する理由は、2進数で記述された場合の奇数は、最初の桁が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

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

詳細については、Pythonビット演算子のページを確認してください。

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

これは質問と正確には関係ありませんが、データサイエンティストやコンピュータービジョンエンジニアにとって、この方法は役立つ可能性があります。

于 2020-03-16T09:36:53.163 に答える