2017-07-17 67 views
1

我有这个基本的问题,但不能左右我的头:正确赋值

prepared_data = ([1, '7303 ', 'product1'], [2, '7304 ', 'product2'], [3, '7534 ', 'product3'], [4, '7652 ', 'product4']) 

我要分配这些值,但不能得到如何妥善安排循环:

for row_num in range(2, len(prepared_data)+2): 
    for index in range(len(prepared_data)): 
     wb2_ws1.cell(row=row_num, column=1).value = prepared_data[index][0] 
     wb2_ws1.cell(row=row_num, column=2).value = prepared_data[index][1] 
     wb2_ws1.cell(row=row_num, column=3).value = prepared_data[index][2] 
     wb2_ws1.cell(row=row_num, column=4).value = 'John' 

程序应该填写第二行的单元格。但它总是覆盖之前的所有值。感谢您的帮助

回答

1

如果我理解正确,您只需要一个for循环,其中row_numprepared_data索引的函数。您可以通过使用enumerate以适当的起始值来使该功能隐含。

for row_num, (some_int, some_str, some_label) in enumerate(prepared_data, start=2): 
    wb2_ws1.cell(row=row_num, column=1).value = some_int 
    wb2_ws1.cell(row=row_num, column=2).value = some_str 
    wb2_ws1.cell(row=row_num, column=3).value = some_label 
    wb2_ws1.cell(row=row_num, column=4).value = 'John' 
+0

谢谢,它的工作。我不知道你可以循环这两个值 – neptunereach

0

它看起来像你想拥有这样的:

1|2|3 
    7303|7304|7354 
    product1|product2|product3 

但是,当你的行数都在增加,你的index是各行中重置,所以你总是得到的第一行。

有两种方法可以做到这一点:要么你直接写列:

for col_num, col in enumerate(prepared_data): 
    for row_num, value in enumerate(col, 2): 
     ws.cell(row=row_num, column=col_num, value=value) 

或者你用你的zip()名单上调换成员,使你可以append()你的表。这是作为练习给读者的!