我正在尝试在循环中修改列表。
让我们假设我们有一个名为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):
)也不起作用。
你能为这个问题提出一个优雅的工作方法吗?提前谢谢。
答案 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