2015-02-11 36 views
0

'nearestzipcodes'是一个包含5个项目(一个键/值)的列表。我试图只取每个值并将其分配给account.nearestzip1到5.下面我猜测的代码将不起作用,因为它将每个项目的所有5个分配给nearestzipcodes中的每个项目。如何在for循环中将变量名+1加1?

我该如何纠正这个循环?我只需在nearestzip的末尾添加+1并删除接下来的4个重复行?

for i in nearestzipcodes: 
    account.nearestzip1 = i.values() 
    account.nearestzip2 = i.values() 
    account.nearestzip3 = i.values() 
    account.nearestzip4 = i.values() 
    account.nearestzip5 = i.values() 
+1

更换account.nearestzip1-5一个列表。 – 2015-02-11 17:59:28

回答

0

您可以使用SETATTR,像这样:

for i,v in enumerate(nearestzipcodes,1): 
    setattr(account, 'nearestzip' + str(i), v.values()) 

这是一个奇怪的设计选择,但是。引起注意的真正问题是为什么不使用account内的某种容器来容纳nearestzip

虽然setattr应该直接为您的目的服务,但它的使用通常更多地用于动态属性访问不可避免的情况;它会导致额外的性能成本,并使代码不易读。只有你必须使用它。在我看来,你的情况是在account里面的list属性大喊大叫。您可以通过索引获得相同的结果:

account.nearestzip[0] 
account.nearestzip[1] 
account.nearestzip[2] 
... 
+0

那么就像在我的django模型里面放一个列表? – david 2015-02-11 18:10:35

+0

@donnaloia我不熟悉_django_,并且不能真正为您提供一门课程的建议。如果这些属性在某种程度上是API的一部分,那么我想你可以回到'setattr'上。你必须打这个电话。 – Eithos 2015-02-11 18:12:22

+0

好的,谢谢。 – david 2015-02-11 18:13:43

0

每个account.nearestzipcode是一个Django formfield项,所以我不知道如何与清单取代它。我会很感激这样的一个例子。

在任何情况下,由于只有5列表中的项目,我想我可以这样做:

account.nearestzip1 = nearestzipcodes[0] 
account.nearestzip2 = nearestzipcodes[1] 
account.nearestzip3 = nearestzipcodes[2] 
account.nearestzip4 = nearestzipcodes[3] 
account.nearestzip5 = nearestzipcodes[4]