1

申し訳ありませんが、暗黙の for ループがわかりません。それで、誰かが私のためにこれをもう少し説明してくれるかどうか尋ねることができると思いました.

私は、非常に苦労して、次の暗黙の for ループを書きました。

ueberdata= [1,5,2,6,1,2,3,4,1,3,5,6]
order = [1,3,5]
ind = [list(ueberdata).index(i) for i in order]

これにより、最初に出現したもののインデックスが順番に表示されます。

ind : 0,6,11

ここまでは順調。ここで、この例を拡張したいと思います。多分 ueberdata の方が大きいです。たぶん、すべてのインデックスを取得したいと思います。そして、私は困惑しています。これらの for ループを何らかの形でネストする必要があります。この問題を解決するのに十分な理解を助けてくれる人はいますか?

いくつかの明確化(申し訳ありませんが、私は本当に自分自身をよりよく表現する必要があります):私が本質的にやりたいことは、データセットをプロットすることです。プロットで見たいこれらの 3 種類のデータポイントがあります。今、私のデータセットはもちろん3よりも長いです:)。そして、別の列をプロットしたいので、それらのインデックスが必要です。今さら言って申し訳ありませんが、私の質問から気をそらすかもしれないと思いました。最初のセットだけでなく、ファイル内のすべてのデータポイントをプロットしたい。

4

3 に答える 3

6

それは「リスト内包表記」と呼ばれます。

あなたのコードはもっと簡単にできるかもしれませんが、すでにリストを持っているのになぜリストを再作成するのかわかりません:

ind = [uberdata.index(i) for i in order]

より多くのインデックスが必要な場合は、order長くしてください。

于 2013-03-07T15:12:39.640 に答える
2

すべてのインデックスが必要な場合は、次のようにすることができます

>>> ueberdata= [1,5,2,6,1,2,3,4,1,3,5,6]
>>> order = [1,3,5]
>>> [[i for i,j in enumerate(ueberdata) if j==k] for k in order]
[[0, 4, 8], [6, 9], [1, 10]]

リストが非常に大きくなる可能性がある場合は、ヘルパー defaultdict を作成する方が効率的です

>>> from collections import defaultdict
>>> D = defaultdict(list)
>>> orderset = set(order)
>>> for i,j in enumerate(ueberdata):
...  if j in orderset:
...   D[j].append(i)
... 
>>> [D[i] for i in order]
[[0, 4, 8], [6, 9], [1, 10]]
于 2013-03-07T15:20:02.247 に答える
1

python documentationから、リスト内包表記は次のように読むことができます

「for句が続く式を含むブラケット、次に0個以上のforまたはif句。結果は、それに続くforおよびif句のコンテキストで式を評価した結果の新しいリストになります。」

[list(ueberdata).index(i) for i in order]

ある意味で似ている

ind=[]
for i in order:
  ind.append(list(ueberdata).index(i))

最初の質問に答えて、リストのサイズに依存しません。

すべてのインデックスを取得するには、次のような補助関数を使用します

lambda value : [x for x in range(len(ueberdata)) if ueberdata[x] == value]
于 2013-03-07T15:25:24.490 に答える