1

道路オブジェクトのリストから項目が削除されないのはなぜですか?

関連情報

Road オブジェクトは (self、city1、city2、length) を取り、City オブジェクトは (self、name、population) を取ります。

これらのオブジェクトを変更できるように、リスト _cities および _roads に保存しています。

この定義は、都市に接続されているすべての道路を削除してから、都市を削除することになっています。

ただし、私のコードは道路を削除したくないため (そしてエラーは発生しません)、ロジックに欠陥があるに違いありません。

手伝ってくれますか?

class Network:

    def __init__(self):

        self._cities = []  # list of City objects in this network
        self._roads = []   # list of Road objects in this network

    def hasCity(self, name):

        for x in self._cities:
            if x.name == name:
                return True
        return False

    def hasRoad(self, road):

        for x in self._roads:
            if x.city1 == road[0] and x.city2 == road[1]:
                return True
            elif x.city1 == road[1] and x.city2 == road[0]:
                return True
            else:
                return False

    def addCity(self, name, pop):
        if self.hasCity(name) == True:
            return False
        else:
            self._cities.append(City(name, pop))
            return True

    def addRoad(self, road, length):

        if self.hasRoad(road) == True:
            return False
        else:
            self._roads.append(Road(road[0], road[1], length))
            return True

    def delRoad(self, road):
        if self.hasRoad(road) == False:
            return False
        else:
            for x in self._roads:
                if x.city1 == road[0] and x.city2 == road[1]:
                    self._roads.remove(x)
                    return True
                elif x.city1 == road[1] and x.city2 == road[0]:
                    self._roads.remove(x)
                    return True
                else:
                    return False


    def delCity(self, city):

        if self.hasCity(city) == False:
            return False
        else:
            for x in self._cities:
                if x.name == city:
                    for j in self._roads:
                        if j.city1 == x.name:
                            self.delRoad((j.city1, j.city2))
                            self.delRoad((j.city2, j.city1))
                        elif j.city2 == x.name:
                            self.delRoad((j.city1, j.city2))
                            self.delRoad((j.city2, j.city1))
                    self._cities.remove(x)
                    return True
4

2 に答える 2

2

その理由は、おそらく、反復するリストの要素を削除したためです。これは一般的に悪い習慣です。

于 2012-11-29T03:56:12.650 に答える
0

delCity は改善される可能性がありますが、問題なく動作しているようです。もっとコードを投稿する必要があると思います。サンプル コードを作成して、delCity をテストしました。これが City クラスです。

class City(object):
    def __init__(self, name, population):
        self.name = name
        self.population = population

    def __repr__(self):
        return "City(%r, %r)" % (self.name, self.population)

道路クラスは次のとおりです。

class Road(object):
    def __init__ (self, city1, city2, length):
        self.city1 = city1
        self.city2 = city2
        self.length = length

    def __repr__(self):
        return "Road(%r, %r, %r)" % (self.city1, self.city2, self.length)

delCity メソッドを貼り付けた Test クラスは次のとおりです。

class Test(object):
    def __init__(self, cities, roads):
        self._cities = cities
        self._roads = roads

    def hasCity(self, city_name):
        for c in self._cities:
            if c.name == city_name:
                return True
        return False

    def delRoad(self, pair):
        for x in self._roads:
            if x.city1 == pair[0] and x.city2 == pair[1]:
                self._roads.remove(x)

    def delCity(self, city):
        if self.hasCity(city) == False: #checks to see if city isn't in list
            return False
        else:
            for x in self._cities:
                if x.name == city:
                    for j in self._roads:
                        if j.city1 == x.name:
                            self.delRoad((j.city1, j.city2)) ##delRoad takes a tuple
                            self.delRoad((j.city2, j.city1))
                        elif j.city2 == x.name:
                            self.delRoad((j.city1, j.city2))
                            self.delRoad((j.city2, j.city1))
                    self._cities.remove(x)
                    return True

そしてここで私はあなたのコードをテストします:

>>> t = Test([City('x', 1), City('y', 1), City('z', 1)],
             [Road('x', 'y', 1), Road('y', 'z', 1)])
>>> t.delCity('x')

>>> print t._cities
[City('y', 1), City('z', 1)]
>>> print t._roads
[Road('y', 'z', 1)]

ご覧のとおり、都市とその都市に向かう単一の道路が削除されました。

于 2012-11-29T04:11:19.887 に答える