1

私は行くリストを持っています:

[1、1、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、1、1、1、1、1、1、1、1]

リストのすべての要素を2より大きい値で印刷したいのですが、リスト内の位置も印刷したいのですが、次のようにして要素を単独で印刷できます。

for bonds in number_of_bonds:       
    if bonds >= 2:
         print bonds

しかし、enumerateを使用すると、代わりにリスト内のすべてのアイテムが次のような位置で出力されます。

(0, 1)
(1, 1)
(2, 3)

では、これを行う正しい方法は何ですか?

4

8 に答える 8

6

あなたの問題のためにあなたはすることができます

[(i, j) for i,j in enumerate(l) if j > 2]

出力:

[(2, 3),
 (3, 3),
 (4, 3),
 (5, 3),
 (6, 3),
 (7, 3),
 (8, 3),
 (9, 3),
 (10, 3),
 (11, 3),
 (12, 3),
 (13, 3),
 (14, 3),
 (15, 3)]
于 2013-03-05T11:16:22.417 に答える
5
lst = [1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1]
print [(i, e) for (i, e) in enumerate(lst) if e > 2]

[(2, 3),
 (3, 3),
 (4, 3),
 (5, 3),
 (6, 3),
 (7, 3),
 (8, 3),
 (9, 3),
 (10, 3),
 (11, 3),
 (12, 3),
 (13, 3),
 (14, 3),
 (15, 3)]

リストが膨大な場合は、ジェネレーターを使用()して、メモリ内で一度にすべての要素を生成するのではなく、その場で各要素を生成することをお勧めします。

result = ((i, e) for (i, e) in enumerate(lst) if e > 2)

for i in result:
    print i

その場合、出力は次のようになります。

(2, 3)
(3, 3)
(4, 3)
(5, 3)
(6, 3)
(7, 3)
(8, 3)
(9, 3)
(10, 3)
(11, 3)
(12, 3)
(13, 3)
(14, 3)
(15, 3)

ジェネレーターは1回しか読み取ることができないことに注意してください。つまり、resultもう一度ループしても何も出力されません。

于 2013-03-05T11:17:43.623 に答える
0
lst = [1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1]
print [(i, e) for (i, e) in enumerate(lst) if e > 2]

soryprevoiusly私はそれをc-Languageで書きました。

于 2013-03-05T11:17:58.150 に答える
0

リストを理解する

interesting_bonds = [index, bonds for index, bonds in enumerate(number_of_bonds) if bonds > 2]
for bonds in interesting_bonds:
    print bonds

リスト内包表記は、興味のある要素を取得するためのより「Pythonic」な方法です。組み込みのを使用することもできますfilter

編集:Jonが以下のコメントで指摘したように、フィルタリング後に列挙すると、元のリストから正しいインデックスが得られません。だから、列挙されたリストで理解をするだけです。

于 2013-03-05T11:18:32.790 に答える
0

機能的なスタイル:

filter(lambda (a,b): b >= 2, enumerate(L))

結果:

[(2, 3), (3, 3), (4, 3), (5, 3), (6, 3), (7, 3), (8, 3), (9, 3), (10, 3), (11, 3), (12, 3), (13, 3), (14, 3), (15, 3)]

これはenumeratefunctionfilterfunctionを使用します。

于 2013-03-05T11:23:45.553 に答える
0

変数 i を追加するだけで、ループが再開するたびに +1 カウントされます。

i = 0
for bonds in number_of_bonds:       
     if bonds >= 2:
     print bonds
     print i
     i += 1
于 2013-03-05T11:20:11.323 に答える
0

したがって、元のリストの位置を印刷したい場合(フィルタリングを行う前に)、これはあなたがやりたいと思うことですが、最初にアイテムを列挙し、次にそれらのそれぞれについて、興味のないもの。それ以外の場合、新しいフィルタリングされたリスト内の要素の位置を出力したい場合は、 kunev answer が正しいものです。これが私が意味するコードです:

for i,bond in enumerate(number_of_bonds):
    if bond >=2:
        print (i,bond)
于 2013-03-05T11:25:33.963 に答える
0
for i in range(len(number_of_bonds)):
    if number_of_bonds[i] >= 2:
        print i, number_of_bonds[i]

forループでカウンターを使用しないのはなぜですか

于 2013-03-05T11:21:11.210 に答える