使用循环内的对象修改列表

时间:2014-10-21 12:53:08

标签: python iteration

我正在尝试在循环中修改列表。

让我们假设我们有一个名为Node的类具有3个属性(Node.x,Node.y,Node.z)。有两个列表填充了对象Node的N和M个场合。

我正在尝试在两个列表之间建立双边匹配/连接,因此在每次配对后,必须修改初始对象以继续比较其他列。

这是上面描述的示例代码。

offer =  [ Node_o1, Node_o2, ...., Node_oN ] 
demand = [ Node_d1, Node_d2,...., Node_dM  ]
connections = []
disThresh = 100

for i in offer:
    for j in demand:
        dist = Distance(i,j)
        if dist < disThresh and min(i.z, j.z) > 0: #if there is z available to send
            print 'Connected offer %r with demand %r. Dist: %r' % (i , j, dist)
            link = min(i.z, j.z)
            i.z = i.z - link
            j.z = j.z - link
            connections.append([i,j])

在一半的迭代之后,程序表现得非常奇怪,因为它显然使用了来自迭代器的初始数据而不是修改过的。我试图迭代列表的副本(offer[:]),但它仍然不起作用。虽然循环或枚举器(for i,v in enumerate(offer):)也不起作用。

你能为这个问题提出一个优雅的工作方法吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您应该更改for循环。 而不是使用迭代器使用商品和需求数组中的索引:

for i in xrange(len(offer)):
    for j in xrange(len(demand)):
        #code here

如果您迭代列表的副本,您将看不到修改。 同样,如果使用迭代器,它将无效:Modifying list while iterating

我用以下方式修改了你的代码,逻辑不会完全相同,因为我不知道你的对象里面有什么,但是你可以看到列表被修改到位并且修改在迭代时可见。:

offer =  [ 1, 8, 3 ]
demand = [ 1, 10, 11, 7 ]
connections = []
disThresh = 100

for i in xrange(len(offer)):
    for j in xrange(len(demand)):
        dist = offer[i] - demand[j]
        if dist < disThresh and min(offer[i], demand[j]) > 0: #if there is z available to send                                                                                                                                                                                
            link = min(offer[i], demand[j])
            offer[i] = offer[i] - link
            demand[j] = demand[j] - link
            connections.append([i,j])
            print "Connected ",i,"and",j,"offer",offer,"demand",demand

print connections