1

重複していると思います

反復中にリストからアイテムを削除する

最適なソリューションは次のとおりです。

somelist[:] = [tup for tup in somelist if determine(tup)]

私はそれがどのように機能するかを深く理解していませんが、機能しているようです!!!

今、私はそれがどのように機能するかを理解しています!! (2017/02/05)

私はPythonの初心者で、リストの反復と削除に何か奇妙なことがあると思います。これが私のコードです:

# -*- coding: utf-8 -*-s
#
# Fichier: testques.py
#

liste = [0,1,2,3,4,5,6,7,8,9]

cpt1=0
cpt2=0
cpt3=len(liste)

for i in liste:
    if i != 2:
        cpt1 += 1
    else:
        cpt2 += 1
        del liste[i]

print cpt1
print cpt2
print cpt3

>python test.py
8
1
10

ご覧のとおり、8+1 は 10 ではありません。

私のことは、「i」はリストインデックスへの参照にすぎないということです。要素リストを削除すると、削除した要素の下にあるすべての要素が 1 レベル上がり、次の要素だけが for ... で解析されません。

次に、最終的に次の結果を得るという目標を達成するために、誰かが私を助けてくれませんか: 9 1 10

3つの回答後に編集 私の目標は、2に等しい要素の数を数えることではありません.

実際、私のリストの各要素は辞書であり、各辞書の xxx キーの値が正確に 7 桁でないすべてのリスト項目を削除したいと考えています。そして、きれいになったリストで他の操作を行った後。これが私が達成しようとしていることです。

最初の質問で十分に明確でなくて申し訳ありません。

これが私の実際のコードです:

cpt = 0
liste_longueur_totale = len(i)
liste_longueur_clean = 0
liste_delete = 0
numero = re.compile('^[0-9]{7}$')
for row in i:
    if re.match(numero, row['j_numero']):
        liste_longueur_clean += 1
        cpt += 1
    else:
        liste_delete += 1
        print liste_delete, '-', i[cpt]['j_id'], '-', i[cpt]['j_numero']
        del i[cpt]
        cpt += 1
print "%s : %s + %s" % (liste_longueur_totale,liste_longueur_clean,liste_delete )
print len(i)

「i」は703項目のリストです。それぞれが辞書です。

実行すると、次の結果が得られました。

703: 673 + 15
688

行なしで同じコードを実行すると:

del i[cpt]

私は次の結果を得ました:

703: 681 + 21
703

実際、21 個のアイテムが re.match() に応答していないことがわかっています。

では、ちょっと困惑!!!

4

4 に答える 4

1

難しいことは忘れてください。特に、リストがそれほど長くない場合は、何度も繰り返すのが大変です。

cpt1 = sum(1 for x in liste if x != 2)
cpt2 = sum(1 for x in liste if x == 2)
于 2012-11-22T23:54:43.150 に答える
1

リストから要素を反復して削除する前に、リストのコピーを作成するだけです。

liste = [0,1,2,3,4,5,6,7,8,9]

cpt1=0
cpt2=0
cpt3=len(liste)

# Just add [:] here. See explanation below.
for i in liste[:]:
    if i != 2:
        cpt1 += 1
    else:
        cpt2 += 1
        del liste[i]

print cpt1
print cpt2
print cpt3

list[:]リストをコピーするためのよく知られたイディオムです。これは実際には最初の要素から最後の要素までのスライスであり、元のすべての要素を含む新しいリストを返します。

于 2012-11-22T23:56:19.873 に答える
0

実際には i はリスト インデックスへの参照ではなく、リスト アイテムであるため、削除するとリストが短くなります。len(liste)=9 です。リスト インデックスの配列だけが必要な場合は、代わりに enumerate(liste) を使用します。 、インデックスを削除するポイントがわかりませんが

于 2012-11-22T23:58:14.353 に答える
0

リストにある 2 の数を数えたい場合は、単純に入力print liste.count(2)して 1 を取得します。9 を取得するには、減算するかlen(liste) - liste.count(2)、Ignacio のソリューションに従いますsum(1 for x in liste if x != 2)

于 2012-11-23T00:09:13.380 に答える