Search code examples
pythonfor-looppython-2.6ends-with

Python (2.6.6) endswith() in for loop


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

gives the following output (so the loop is working and reading everything correctly):

['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']

but when I remove the # marks to run the if statement, where it should remove the strings ending in .shp, the string road remains in the list?

['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']

Something else I noticed, it doesn't print all the strings when it's clearly in a for loop that should go through each string? Can someone please explain what's going wrong, where the loop keeps the string road but finds the other strings ending with .shp and removes them correctly?

Thanks, C

(FYI, this is on Python 2.6.6, because of Arc 10.0)


Solution

  • You are mutating the list and causing the index to skip.

    Use a list comprehension like this:

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

    and then get:

    >>> ['the train', 'a mall', 'the ferry', 'a viaduct']