3

私は次のような機能を手に入れました

def f():
    ...
    ...
    return [list1, list2]

これはリストのリストを返します

[[list1.item1,list1.item2,...],[list2.item1,list2.item2,...]]

今私が次のことをするとき:

for i in range(0,2):print f()[i][0:10]

それは動作し、スライスされたリストを印刷します

しかし、私がそうするなら

print f()[0:2][0:10]

次に、[0:10]スライスを無視してリストを出力します。

2番目のフォームを機能させる方法はありますか、それとも目的の結果を得るために毎回ループする必要がありますか?

4

3 に答える 3

10

2番目のスライスは、最初のスライスから返されたシーケンスをスライスするため、はい、次の範囲内でスライスするには、何らかの方法でループする必要があります。

[x[0:10] for x in f()[0:2]]
于 2010-03-18T00:54:45.033 に答える
7

これら2つの動作が異なる理由は、次のように機能するためf()[0:2][0:10]です。

  1. f()リストのリストが表示されます。
  2. [0:2]リストのリストの最初の2つの要素を含むリストを提供します。リストのリストの要素はリストであるため、これリストのリストです。
  3. [0:10]手順2で作成されたリストのリストの最初の10個の要素を含むリストが表示されます。

つまり、f()[0:2][0:10]リストのリストから始めて、そのリストのリスト(リストのリストでもある)のサブリストを取得し、次にリストの2番目のリスト(リストのリストでもある)のサブリストを取得します。 。

対照的に、f()[i]実際にはリストのリストから-番目の要素を抽出しiます。これは単なるリストです(リストのリストではありません)。次に、を適用すると、リストのリストではなく、[0:10]取得した単純なリストに適用されf()[i]ます。

[i]肝心なのは、目的の動作を提供するソリューションは、のようなスライスだけで作業するのではなく、ある時点でのように単一の配列要素にアクセスする必要があるということ[i:j]です。

于 2010-03-18T00:55:11.423 に答える
0

pythonicループは次のようになります。

for list in f()[0:2]:
    print list[0:10]

ただし、達成したいことによっては、リストの理解がさらに向上する場合があります。

map()または、Python関数を利用します。

def print_sub(x):
    print x[0:10]

map(print_sub, f()[0:2])

いずれにせよ、リストを反復処理せずに目的の結果を達成する方法はありません。

于 2010-03-18T00:53:07.330 に答える