1
park = "a park.shp"
road = "the roads.shp"
school = "a school.shp"
train = "the train"
bus = "the bus.shp"
mall = "a mall"
ferry = "the ferry"
viaduct = "a viaduct"

dataList = [park, road, school, train, bus, mall, ferry, viaduct]

print dataList

for a in dataList:
    print a
    #if a.endswith(".shp"):
     #   dataList.remove(a)

print dataList

次の出力が得られます(したがって、ループが機能し、すべてを正しく読み取っています)。

['a park.shp', 'the roads.shp', 'a school.shp', 'the train', 'the bus.shp', 'a mall', 'the ferry', 'a viaduct']
a park.shp
the roads.shp
a school.shp
the train
the bus.shp
a mall
the ferry
a viaduct
['a park.shp', 'the roads.shp', 'a school.shp', 'the train', 'the bus.shp', 'a mall', 'the ferry', 'a viaduct']

しかし、# マークを削除して if ステートメントを実行すると、.shp で終わる文字列を削除する必要がありますが、文字列の道はリストに残りますか?

['a park.shp', 'the roads.shp', 'a school.shp', 'the train', 'the bus.shp', 'a mall', 'the ferry', 'a viaduct']
a park.shp
a school.shp
the bus.shp
the ferry
a viaduct
['the roads.shp', 'the train', 'a mall', 'the ferry', 'a viaduct']

私が気付いた他の何か、各文字列を通過する必要があるforループにあることが明らかな場合、すべての文字列が出力されませんか? 誰かが何が問題なのか説明してもらえますか?

ありがとう、C

(参考までに、これは Arc 10.0 のため、Python 2.6.6 上にあります)

4

2 に答える 2

1

リストを変更しているため、インデックスがスキップされます。

次のようなリスト内包表記を使用します。

[d for d in dataList if not d.endswith('.shp')]

そして取得します:

>>> ['the train', 'a mall', 'the ferry', 'a viaduct']
于 2013-10-09T23:30:46.533 に答える
0

反復している同じリストからアイテムを削除すると、ほとんどの場合、問題が発生します。元のリストのコピーを作成し、代わりにそれを繰り返します。そうすれば、何もスキップしません。

for a in dataList[:]: # Iterate over a copy of the list
    print a
    if a.endswith(".shp"):
        dataList.remove(a) # Remove items from the original, not the copy

もちろん、このループがファイルのないリストを作成する以外に目的がない場合は、1 つのリスト内包.shp表記を使用するだけで、混乱全体をスキップできます。

no_shp_files = [a for a in datalist if not a.endswith('.shp')]
于 2013-10-09T23:27:51.110 に答える