从列表元组中正确赋值

时间:2017-07-17 16:38:20

标签: python dictionary for-loop openpyxl

我有这个基本问题,但无法理解:

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'

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

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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()到您的工作表。这是留给读者的练习!